mirror of
				https://github.com/musix-org/musix-oss
				synced 2025-11-04 03:39:32 +00:00 
			
		
		
		
	opus
This commit is contained in:
		
							
								
								
									
										15
									
								
								node_modules/.bin/detect-libc
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								node_modules/.bin/detect-libc
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					case `uname` in
 | 
				
			||||||
 | 
					    *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
 | 
				
			||||||
 | 
					esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ -x "$basedir/node" ]; then
 | 
				
			||||||
 | 
					  "$basedir/node"  "$basedir/../detect-libc/bin/detect-libc.js" "$@"
 | 
				
			||||||
 | 
					  ret=$?
 | 
				
			||||||
 | 
					else 
 | 
				
			||||||
 | 
					  node  "$basedir/../detect-libc/bin/detect-libc.js" "$@"
 | 
				
			||||||
 | 
					  ret=$?
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					exit $ret
 | 
				
			||||||
							
								
								
									
										17
									
								
								node_modules/.bin/detect-libc.cmd
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								node_modules/.bin/detect-libc.cmd
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					@ECHO off
 | 
				
			||||||
 | 
					SETLOCAL
 | 
				
			||||||
 | 
					CALL :find_dp0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					IF EXIST "%dp0%\node.exe" (
 | 
				
			||||||
 | 
					  SET "_prog=%dp0%\node.exe"
 | 
				
			||||||
 | 
					) ELSE (
 | 
				
			||||||
 | 
					  SET "_prog=node"
 | 
				
			||||||
 | 
					  SET PATHEXT=%PATHEXT:;.JS;=;%
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"%_prog%"  "%dp0%\..\detect-libc\bin\detect-libc.js" %*
 | 
				
			||||||
 | 
					ENDLOCAL
 | 
				
			||||||
 | 
					EXIT /b %errorlevel%
 | 
				
			||||||
 | 
					:find_dp0
 | 
				
			||||||
 | 
					SET dp0=%~dp0
 | 
				
			||||||
 | 
					EXIT /b
 | 
				
			||||||
							
								
								
									
										18
									
								
								node_modules/.bin/detect-libc.ps1
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								node_modules/.bin/detect-libc.ps1
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env pwsh
 | 
				
			||||||
 | 
					$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$exe=""
 | 
				
			||||||
 | 
					if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
 | 
				
			||||||
 | 
					  # Fix case when both the Windows and Linux builds of Node
 | 
				
			||||||
 | 
					  # are installed in the same directory
 | 
				
			||||||
 | 
					  $exe=".exe"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					$ret=0
 | 
				
			||||||
 | 
					if (Test-Path "$basedir/node$exe") {
 | 
				
			||||||
 | 
					  & "$basedir/node$exe"  "$basedir/../detect-libc/bin/detect-libc.js" $args
 | 
				
			||||||
 | 
					  $ret=$LASTEXITCODE
 | 
				
			||||||
 | 
					} else {
 | 
				
			||||||
 | 
					  & "node$exe"  "$basedir/../detect-libc/bin/detect-libc.js" $args
 | 
				
			||||||
 | 
					  $ret=$LASTEXITCODE
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					exit $ret
 | 
				
			||||||
							
								
								
									
										15
									
								
								node_modules/.bin/mkdirp
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								node_modules/.bin/mkdirp
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					case `uname` in
 | 
				
			||||||
 | 
					    *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
 | 
				
			||||||
 | 
					esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ -x "$basedir/node" ]; then
 | 
				
			||||||
 | 
					  "$basedir/node"  "$basedir/../mkdirp/bin/cmd.js" "$@"
 | 
				
			||||||
 | 
					  ret=$?
 | 
				
			||||||
 | 
					else 
 | 
				
			||||||
 | 
					  node  "$basedir/../mkdirp/bin/cmd.js" "$@"
 | 
				
			||||||
 | 
					  ret=$?
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					exit $ret
 | 
				
			||||||
							
								
								
									
										17
									
								
								node_modules/.bin/mkdirp.cmd
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								node_modules/.bin/mkdirp.cmd
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					@ECHO off
 | 
				
			||||||
 | 
					SETLOCAL
 | 
				
			||||||
 | 
					CALL :find_dp0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					IF EXIST "%dp0%\node.exe" (
 | 
				
			||||||
 | 
					  SET "_prog=%dp0%\node.exe"
 | 
				
			||||||
 | 
					) ELSE (
 | 
				
			||||||
 | 
					  SET "_prog=node"
 | 
				
			||||||
 | 
					  SET PATHEXT=%PATHEXT:;.JS;=;%
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"%_prog%"  "%dp0%\..\mkdirp\bin\cmd.js" %*
 | 
				
			||||||
 | 
					ENDLOCAL
 | 
				
			||||||
 | 
					EXIT /b %errorlevel%
 | 
				
			||||||
 | 
					:find_dp0
 | 
				
			||||||
 | 
					SET dp0=%~dp0
 | 
				
			||||||
 | 
					EXIT /b
 | 
				
			||||||
							
								
								
									
										18
									
								
								node_modules/.bin/mkdirp.ps1
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								node_modules/.bin/mkdirp.ps1
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env pwsh
 | 
				
			||||||
 | 
					$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$exe=""
 | 
				
			||||||
 | 
					if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
 | 
				
			||||||
 | 
					  # Fix case when both the Windows and Linux builds of Node
 | 
				
			||||||
 | 
					  # are installed in the same directory
 | 
				
			||||||
 | 
					  $exe=".exe"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					$ret=0
 | 
				
			||||||
 | 
					if (Test-Path "$basedir/node$exe") {
 | 
				
			||||||
 | 
					  & "$basedir/node$exe"  "$basedir/../mkdirp/bin/cmd.js" $args
 | 
				
			||||||
 | 
					  $ret=$LASTEXITCODE
 | 
				
			||||||
 | 
					} else {
 | 
				
			||||||
 | 
					  & "node$exe"  "$basedir/../mkdirp/bin/cmd.js" $args
 | 
				
			||||||
 | 
					  $ret=$LASTEXITCODE
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					exit $ret
 | 
				
			||||||
							
								
								
									
										15
									
								
								node_modules/.bin/needle
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								node_modules/.bin/needle
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					case `uname` in
 | 
				
			||||||
 | 
					    *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
 | 
				
			||||||
 | 
					esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ -x "$basedir/node" ]; then
 | 
				
			||||||
 | 
					  "$basedir/node"  "$basedir/../needle/bin/needle" "$@"
 | 
				
			||||||
 | 
					  ret=$?
 | 
				
			||||||
 | 
					else 
 | 
				
			||||||
 | 
					  node  "$basedir/../needle/bin/needle" "$@"
 | 
				
			||||||
 | 
					  ret=$?
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					exit $ret
 | 
				
			||||||
							
								
								
									
										17
									
								
								node_modules/.bin/needle.cmd
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								node_modules/.bin/needle.cmd
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					@ECHO off
 | 
				
			||||||
 | 
					SETLOCAL
 | 
				
			||||||
 | 
					CALL :find_dp0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					IF EXIST "%dp0%\node.exe" (
 | 
				
			||||||
 | 
					  SET "_prog=%dp0%\node.exe"
 | 
				
			||||||
 | 
					) ELSE (
 | 
				
			||||||
 | 
					  SET "_prog=node"
 | 
				
			||||||
 | 
					  SET PATHEXT=%PATHEXT:;.JS;=;%
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"%_prog%"  "%dp0%\..\needle\bin\needle" %*
 | 
				
			||||||
 | 
					ENDLOCAL
 | 
				
			||||||
 | 
					EXIT /b %errorlevel%
 | 
				
			||||||
 | 
					:find_dp0
 | 
				
			||||||
 | 
					SET dp0=%~dp0
 | 
				
			||||||
 | 
					EXIT /b
 | 
				
			||||||
							
								
								
									
										18
									
								
								node_modules/.bin/needle.ps1
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								node_modules/.bin/needle.ps1
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env pwsh
 | 
				
			||||||
 | 
					$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$exe=""
 | 
				
			||||||
 | 
					if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
 | 
				
			||||||
 | 
					  # Fix case when both the Windows and Linux builds of Node
 | 
				
			||||||
 | 
					  # are installed in the same directory
 | 
				
			||||||
 | 
					  $exe=".exe"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					$ret=0
 | 
				
			||||||
 | 
					if (Test-Path "$basedir/node$exe") {
 | 
				
			||||||
 | 
					  & "$basedir/node$exe"  "$basedir/../needle/bin/needle" $args
 | 
				
			||||||
 | 
					  $ret=$LASTEXITCODE
 | 
				
			||||||
 | 
					} else {
 | 
				
			||||||
 | 
					  & "node$exe"  "$basedir/../needle/bin/needle" $args
 | 
				
			||||||
 | 
					  $ret=$LASTEXITCODE
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					exit $ret
 | 
				
			||||||
							
								
								
									
										15
									
								
								node_modules/.bin/node-pre-gyp
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								node_modules/.bin/node-pre-gyp
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					case `uname` in
 | 
				
			||||||
 | 
					    *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
 | 
				
			||||||
 | 
					esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ -x "$basedir/node" ]; then
 | 
				
			||||||
 | 
					  "$basedir/node"  "$basedir/../node-pre-gyp/bin/node-pre-gyp" "$@"
 | 
				
			||||||
 | 
					  ret=$?
 | 
				
			||||||
 | 
					else 
 | 
				
			||||||
 | 
					  node  "$basedir/../node-pre-gyp/bin/node-pre-gyp" "$@"
 | 
				
			||||||
 | 
					  ret=$?
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					exit $ret
 | 
				
			||||||
							
								
								
									
										17
									
								
								node_modules/.bin/node-pre-gyp.cmd
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								node_modules/.bin/node-pre-gyp.cmd
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					@ECHO off
 | 
				
			||||||
 | 
					SETLOCAL
 | 
				
			||||||
 | 
					CALL :find_dp0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					IF EXIST "%dp0%\node.exe" (
 | 
				
			||||||
 | 
					  SET "_prog=%dp0%\node.exe"
 | 
				
			||||||
 | 
					) ELSE (
 | 
				
			||||||
 | 
					  SET "_prog=node"
 | 
				
			||||||
 | 
					  SET PATHEXT=%PATHEXT:;.JS;=;%
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"%_prog%"  "%dp0%\..\node-pre-gyp\bin\node-pre-gyp" %*
 | 
				
			||||||
 | 
					ENDLOCAL
 | 
				
			||||||
 | 
					EXIT /b %errorlevel%
 | 
				
			||||||
 | 
					:find_dp0
 | 
				
			||||||
 | 
					SET dp0=%~dp0
 | 
				
			||||||
 | 
					EXIT /b
 | 
				
			||||||
							
								
								
									
										18
									
								
								node_modules/.bin/node-pre-gyp.ps1
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								node_modules/.bin/node-pre-gyp.ps1
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env pwsh
 | 
				
			||||||
 | 
					$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$exe=""
 | 
				
			||||||
 | 
					if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
 | 
				
			||||||
 | 
					  # Fix case when both the Windows and Linux builds of Node
 | 
				
			||||||
 | 
					  # are installed in the same directory
 | 
				
			||||||
 | 
					  $exe=".exe"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					$ret=0
 | 
				
			||||||
 | 
					if (Test-Path "$basedir/node$exe") {
 | 
				
			||||||
 | 
					  & "$basedir/node$exe"  "$basedir/../node-pre-gyp/bin/node-pre-gyp" $args
 | 
				
			||||||
 | 
					  $ret=$LASTEXITCODE
 | 
				
			||||||
 | 
					} else {
 | 
				
			||||||
 | 
					  & "node$exe"  "$basedir/../node-pre-gyp/bin/node-pre-gyp" $args
 | 
				
			||||||
 | 
					  $ret=$LASTEXITCODE
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					exit $ret
 | 
				
			||||||
							
								
								
									
										15
									
								
								node_modules/.bin/nopt
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								node_modules/.bin/nopt
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					case `uname` in
 | 
				
			||||||
 | 
					    *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
 | 
				
			||||||
 | 
					esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ -x "$basedir/node" ]; then
 | 
				
			||||||
 | 
					  "$basedir/node"  "$basedir/../nopt/bin/nopt.js" "$@"
 | 
				
			||||||
 | 
					  ret=$?
 | 
				
			||||||
 | 
					else 
 | 
				
			||||||
 | 
					  node  "$basedir/../nopt/bin/nopt.js" "$@"
 | 
				
			||||||
 | 
					  ret=$?
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					exit $ret
 | 
				
			||||||
							
								
								
									
										17
									
								
								node_modules/.bin/nopt.cmd
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								node_modules/.bin/nopt.cmd
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					@ECHO off
 | 
				
			||||||
 | 
					SETLOCAL
 | 
				
			||||||
 | 
					CALL :find_dp0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					IF EXIST "%dp0%\node.exe" (
 | 
				
			||||||
 | 
					  SET "_prog=%dp0%\node.exe"
 | 
				
			||||||
 | 
					) ELSE (
 | 
				
			||||||
 | 
					  SET "_prog=node"
 | 
				
			||||||
 | 
					  SET PATHEXT=%PATHEXT:;.JS;=;%
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"%_prog%"  "%dp0%\..\nopt\bin\nopt.js" %*
 | 
				
			||||||
 | 
					ENDLOCAL
 | 
				
			||||||
 | 
					EXIT /b %errorlevel%
 | 
				
			||||||
 | 
					:find_dp0
 | 
				
			||||||
 | 
					SET dp0=%~dp0
 | 
				
			||||||
 | 
					EXIT /b
 | 
				
			||||||
							
								
								
									
										18
									
								
								node_modules/.bin/nopt.ps1
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								node_modules/.bin/nopt.ps1
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env pwsh
 | 
				
			||||||
 | 
					$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$exe=""
 | 
				
			||||||
 | 
					if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
 | 
				
			||||||
 | 
					  # Fix case when both the Windows and Linux builds of Node
 | 
				
			||||||
 | 
					  # are installed in the same directory
 | 
				
			||||||
 | 
					  $exe=".exe"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					$ret=0
 | 
				
			||||||
 | 
					if (Test-Path "$basedir/node$exe") {
 | 
				
			||||||
 | 
					  & "$basedir/node$exe"  "$basedir/../nopt/bin/nopt.js" $args
 | 
				
			||||||
 | 
					  $ret=$LASTEXITCODE
 | 
				
			||||||
 | 
					} else {
 | 
				
			||||||
 | 
					  & "node$exe"  "$basedir/../nopt/bin/nopt.js" $args
 | 
				
			||||||
 | 
					  $ret=$LASTEXITCODE
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					exit $ret
 | 
				
			||||||
							
								
								
									
										15
									
								
								node_modules/.bin/rc
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								node_modules/.bin/rc
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					case `uname` in
 | 
				
			||||||
 | 
					    *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
 | 
				
			||||||
 | 
					esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ -x "$basedir/node" ]; then
 | 
				
			||||||
 | 
					  "$basedir/node"  "$basedir/../rc/cli.js" "$@"
 | 
				
			||||||
 | 
					  ret=$?
 | 
				
			||||||
 | 
					else 
 | 
				
			||||||
 | 
					  node  "$basedir/../rc/cli.js" "$@"
 | 
				
			||||||
 | 
					  ret=$?
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					exit $ret
 | 
				
			||||||
							
								
								
									
										17
									
								
								node_modules/.bin/rc.cmd
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								node_modules/.bin/rc.cmd
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					@ECHO off
 | 
				
			||||||
 | 
					SETLOCAL
 | 
				
			||||||
 | 
					CALL :find_dp0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					IF EXIST "%dp0%\node.exe" (
 | 
				
			||||||
 | 
					  SET "_prog=%dp0%\node.exe"
 | 
				
			||||||
 | 
					) ELSE (
 | 
				
			||||||
 | 
					  SET "_prog=node"
 | 
				
			||||||
 | 
					  SET PATHEXT=%PATHEXT:;.JS;=;%
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"%_prog%"  "%dp0%\..\rc\cli.js" %*
 | 
				
			||||||
 | 
					ENDLOCAL
 | 
				
			||||||
 | 
					EXIT /b %errorlevel%
 | 
				
			||||||
 | 
					:find_dp0
 | 
				
			||||||
 | 
					SET dp0=%~dp0
 | 
				
			||||||
 | 
					EXIT /b
 | 
				
			||||||
							
								
								
									
										18
									
								
								node_modules/.bin/rc.ps1
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								node_modules/.bin/rc.ps1
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env pwsh
 | 
				
			||||||
 | 
					$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$exe=""
 | 
				
			||||||
 | 
					if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
 | 
				
			||||||
 | 
					  # Fix case when both the Windows and Linux builds of Node
 | 
				
			||||||
 | 
					  # are installed in the same directory
 | 
				
			||||||
 | 
					  $exe=".exe"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					$ret=0
 | 
				
			||||||
 | 
					if (Test-Path "$basedir/node$exe") {
 | 
				
			||||||
 | 
					  & "$basedir/node$exe"  "$basedir/../rc/cli.js" $args
 | 
				
			||||||
 | 
					  $ret=$LASTEXITCODE
 | 
				
			||||||
 | 
					} else {
 | 
				
			||||||
 | 
					  & "node$exe"  "$basedir/../rc/cli.js" $args
 | 
				
			||||||
 | 
					  $ret=$LASTEXITCODE
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					exit $ret
 | 
				
			||||||
							
								
								
									
										15
									
								
								node_modules/.bin/rimraf
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								node_modules/.bin/rimraf
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					#!/bin/sh
 | 
				
			||||||
 | 
					basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					case `uname` in
 | 
				
			||||||
 | 
					    *CYGWIN*|*MINGW*|*MSYS*) basedir=`cygpath -w "$basedir"`;;
 | 
				
			||||||
 | 
					esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ -x "$basedir/node" ]; then
 | 
				
			||||||
 | 
					  "$basedir/node"  "$basedir/../rimraf/bin.js" "$@"
 | 
				
			||||||
 | 
					  ret=$?
 | 
				
			||||||
 | 
					else 
 | 
				
			||||||
 | 
					  node  "$basedir/../rimraf/bin.js" "$@"
 | 
				
			||||||
 | 
					  ret=$?
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					exit $ret
 | 
				
			||||||
							
								
								
									
										17
									
								
								node_modules/.bin/rimraf.cmd
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								node_modules/.bin/rimraf.cmd
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					@ECHO off
 | 
				
			||||||
 | 
					SETLOCAL
 | 
				
			||||||
 | 
					CALL :find_dp0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					IF EXIST "%dp0%\node.exe" (
 | 
				
			||||||
 | 
					  SET "_prog=%dp0%\node.exe"
 | 
				
			||||||
 | 
					) ELSE (
 | 
				
			||||||
 | 
					  SET "_prog=node"
 | 
				
			||||||
 | 
					  SET PATHEXT=%PATHEXT:;.JS;=;%
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					"%_prog%"  "%dp0%\..\rimraf\bin.js" %*
 | 
				
			||||||
 | 
					ENDLOCAL
 | 
				
			||||||
 | 
					EXIT /b %errorlevel%
 | 
				
			||||||
 | 
					:find_dp0
 | 
				
			||||||
 | 
					SET dp0=%~dp0
 | 
				
			||||||
 | 
					EXIT /b
 | 
				
			||||||
							
								
								
									
										18
									
								
								node_modules/.bin/rimraf.ps1
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								node_modules/.bin/rimraf.ps1
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
				
			|||||||
 | 
					#!/usr/bin/env pwsh
 | 
				
			||||||
 | 
					$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					$exe=""
 | 
				
			||||||
 | 
					if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
 | 
				
			||||||
 | 
					  # Fix case when both the Windows and Linux builds of Node
 | 
				
			||||||
 | 
					  # are installed in the same directory
 | 
				
			||||||
 | 
					  $exe=".exe"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					$ret=0
 | 
				
			||||||
 | 
					if (Test-Path "$basedir/node$exe") {
 | 
				
			||||||
 | 
					  & "$basedir/node$exe"  "$basedir/../rimraf/bin.js" $args
 | 
				
			||||||
 | 
					  $ret=$LASTEXITCODE
 | 
				
			||||||
 | 
					} else {
 | 
				
			||||||
 | 
					  & "node$exe"  "$basedir/../rimraf/bin.js" $args
 | 
				
			||||||
 | 
					  $ret=$LASTEXITCODE
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					exit $ret
 | 
				
			||||||
							
								
								
									
										1
									
								
								node_modules/@discordjs/opus/.gitattributes
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@discordjs/opus/.gitattributes
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					* text=auto eol=lf
 | 
				
			||||||
							
								
								
									
										22
									
								
								node_modules/@discordjs/opus/.github/workflows/build.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								node_modules/@discordjs/opus/.github/workflows/build.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
				
			|||||||
 | 
					name: Build
 | 
				
			||||||
 | 
					on: [push, pull_request]
 | 
				
			||||||
 | 
					jobs:
 | 
				
			||||||
 | 
					  build:
 | 
				
			||||||
 | 
					    name: Build
 | 
				
			||||||
 | 
					    runs-on: ${{ matrix.os }}
 | 
				
			||||||
 | 
					    strategy:
 | 
				
			||||||
 | 
					      matrix:
 | 
				
			||||||
 | 
					        os: [macos-latest, ubuntu-latest, windows-latest]
 | 
				
			||||||
 | 
					        node: [12, 13]
 | 
				
			||||||
 | 
					      fail-fast: true
 | 
				
			||||||
 | 
					    steps:
 | 
				
			||||||
 | 
					      - name: Checkout repository
 | 
				
			||||||
 | 
					        uses: actions/checkout@v2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Install Node v${{ matrix.node }}
 | 
				
			||||||
 | 
					        uses: actions/setup-node@v1
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          node-version: ${{ matrix.node }}
 | 
				
			||||||
 | 
					          
 | 
				
			||||||
 | 
					      - name: Install dependencies
 | 
				
			||||||
 | 
					        run: yarn install
 | 
				
			||||||
							
								
								
									
										34
									
								
								node_modules/@discordjs/opus/.github/workflows/release.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								node_modules/@discordjs/opus/.github/workflows/release.yml
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
				
			|||||||
 | 
					name: Prebuild
 | 
				
			||||||
 | 
					on:
 | 
				
			||||||
 | 
					  release:
 | 
				
			||||||
 | 
					    types: [published]
 | 
				
			||||||
 | 
					jobs:
 | 
				
			||||||
 | 
					  build:
 | 
				
			||||||
 | 
					    name: Prebuild
 | 
				
			||||||
 | 
					    runs-on: ${{ matrix.os }}
 | 
				
			||||||
 | 
					    strategy:
 | 
				
			||||||
 | 
					      matrix:
 | 
				
			||||||
 | 
					        os: [macos-latest, ubuntu-latest, windows-latest]
 | 
				
			||||||
 | 
					        node: [12, 13]
 | 
				
			||||||
 | 
					      fail-fast: true
 | 
				
			||||||
 | 
					    steps:
 | 
				
			||||||
 | 
					      - name: Checkout repository
 | 
				
			||||||
 | 
					        uses: actions/checkout@v2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Install Node v${{ matrix.node }}
 | 
				
			||||||
 | 
					        uses: actions/setup-node@v1
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          node-version: ${{ matrix.node }}
 | 
				
			||||||
 | 
					          
 | 
				
			||||||
 | 
					      - name: Install dependencies
 | 
				
			||||||
 | 
					        run: yarn install
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Package prebuild
 | 
				
			||||||
 | 
					        run: yarn build
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      - name: Upload prebuild asset
 | 
				
			||||||
 | 
					        uses: icrawl/action-artifact@v1
 | 
				
			||||||
 | 
					        env:
 | 
				
			||||||
 | 
					          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
 | 
				
			||||||
 | 
					        with:
 | 
				
			||||||
 | 
					          path: 'build/stage/**/*.tar.gz'
 | 
				
			||||||
							
								
								
									
										5
									
								
								node_modules/ref/node_modules/ms/license.md → node_modules/@discordjs/opus/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										5
									
								
								node_modules/ref/node_modules/ms/license.md → node_modules/@discordjs/opus/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -1,6 +1,7 @@
 | 
				
			|||||||
The MIT License (MIT)
 | 
					MIT License
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Copyright (c) 2016 Zeit, Inc.
 | 
					Copyright (c) 2020 iCrawl
 | 
				
			||||||
 | 
					Copyright (c) 2013-2019 Mikko Rantanen
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
					Permission is hereby granted, free of charge, to any person obtaining a copy
 | 
				
			||||||
of this software and associated documentation files (the "Software"), to deal
 | 
					of this software and associated documentation files (the "Software"), to deal
 | 
				
			||||||
							
								
								
									
										51
									
								
								node_modules/@discordjs/opus/binding.gyp
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								node_modules/@discordjs/opus/binding.gyp
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,51 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
						"targets": [
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								"target_name": "<(module_name)",
 | 
				
			||||||
 | 
								"product_dir": "<(module_path)",
 | 
				
			||||||
 | 
								"dependencies": [
 | 
				
			||||||
 | 
									"deps/binding.gyp:libopus",
 | 
				
			||||||
 | 
								],
 | 
				
			||||||
 | 
								"cflags!": [
 | 
				
			||||||
 | 
									"-fno-exceptions",
 | 
				
			||||||
 | 
								],
 | 
				
			||||||
 | 
								"cflags_cc!": [
 | 
				
			||||||
 | 
									"-fno-exceptions",
 | 
				
			||||||
 | 
								],
 | 
				
			||||||
 | 
								"cflags": [
 | 
				
			||||||
 | 
									"-pthread",
 | 
				
			||||||
 | 
									"-fno-strict-aliasing",
 | 
				
			||||||
 | 
									"-Wall",
 | 
				
			||||||
 | 
									"-Wno-unused-parameter",
 | 
				
			||||||
 | 
									"-Wno-missing-field-initializers",
 | 
				
			||||||
 | 
									"-Wextra",
 | 
				
			||||||
 | 
									"-pipe",
 | 
				
			||||||
 | 
									"-fno-ident",
 | 
				
			||||||
 | 
									"-fdata-sections",
 | 
				
			||||||
 | 
									"-ffunction-sections",
 | 
				
			||||||
 | 
									"-fPIC",
 | 
				
			||||||
 | 
								],
 | 
				
			||||||
 | 
								"defines": [
 | 
				
			||||||
 | 
									"LARGEFILE_SOURCE",
 | 
				
			||||||
 | 
									"_FILE_OFFSET_BITS=64",
 | 
				
			||||||
 | 
									"WEBRTC_TARGET_PC",
 | 
				
			||||||
 | 
									"WEBRTC_LINUX",
 | 
				
			||||||
 | 
									"WEBRTC_THREAD_RR",
 | 
				
			||||||
 | 
									"EXPAT_RELATIVE_PATH",
 | 
				
			||||||
 | 
									"GTEST_RELATIVE_PATH",
 | 
				
			||||||
 | 
									"JSONCPP_RELATIVE_PATH",
 | 
				
			||||||
 | 
									"WEBRTC_RELATIVE_PATH",
 | 
				
			||||||
 | 
									"POSIX,"
 | 
				
			||||||
 | 
									"__STDC_FORMAT_MACROS",
 | 
				
			||||||
 | 
									"DYNAMIC_ANNOTATIONS_ENABLED=0",
 | 
				
			||||||
 | 
									"NAPI_DISABLE_CPP_EXCEPTIONS",
 | 
				
			||||||
 | 
								],
 | 
				
			||||||
 | 
								"include_dirs": [
 | 
				
			||||||
 | 
									"<!@(node -p \"require('node-addon-api').include\")"
 | 
				
			||||||
 | 
								],
 | 
				
			||||||
 | 
								"sources": [
 | 
				
			||||||
 | 
									"src/node-opus.cc",
 | 
				
			||||||
 | 
								],
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						],
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										224
									
								
								node_modules/@discordjs/opus/deps/binding.gyp
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										224
									
								
								node_modules/@discordjs/opus/deps/binding.gyp
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,224 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
						"variables": {
 | 
				
			||||||
 | 
							"target_arch%": "x64"
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						"target_defaults": {
 | 
				
			||||||
 | 
							"default_configuration": "Debug",
 | 
				
			||||||
 | 
							"configuration": {
 | 
				
			||||||
 | 
								"Debug": {
 | 
				
			||||||
 | 
									"defines": [ "DEBUG", "_DEBUG" ],
 | 
				
			||||||
 | 
									"msvs_settings": {
 | 
				
			||||||
 | 
										"VSSLCompilerTool": {
 | 
				
			||||||
 | 
											"RuntimeLibrary": 1,
 | 
				
			||||||
 | 
										},
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								"Release": {
 | 
				
			||||||
 | 
									"defines": [ "NODEBUG" ],
 | 
				
			||||||
 | 
									"msvs_settings": {
 | 
				
			||||||
 | 
										"VSSLCompilerTool": {
 | 
				
			||||||
 | 
											"RuntimeLibrary": 0,
 | 
				
			||||||
 | 
										},
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							"msvs_settings": {
 | 
				
			||||||
 | 
								"VCLinkerTool": {
 | 
				
			||||||
 | 
									"GenerateDebugInformation": "true",
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						"targets": [
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								"target_name": "libopus",
 | 
				
			||||||
 | 
								"type": "static_library",
 | 
				
			||||||
 | 
								"sources": [
 | 
				
			||||||
 | 
									"opus/src/opus_multistream.c",
 | 
				
			||||||
 | 
									"opus/src/opus_projection_encoder.c",
 | 
				
			||||||
 | 
									"opus/src/analysis.c",
 | 
				
			||||||
 | 
									"opus/src/mlp_data.c",
 | 
				
			||||||
 | 
									"opus/src/opus_multistream_encoder.c",
 | 
				
			||||||
 | 
									"opus/src/opus_projection_decoder.c",
 | 
				
			||||||
 | 
									"opus/src/mapping_matrix.c",
 | 
				
			||||||
 | 
									"opus/src/opus_compare.c",
 | 
				
			||||||
 | 
									"opus/src/mlp.c",
 | 
				
			||||||
 | 
									"opus/src/opus.c",
 | 
				
			||||||
 | 
									"opus/src/opus_multistream_decoder.c",
 | 
				
			||||||
 | 
									"opus/src/opus_decoder.c",
 | 
				
			||||||
 | 
									"opus/src/repacketizer.c",
 | 
				
			||||||
 | 
									"opus/src/opus_encoder.c",
 | 
				
			||||||
 | 
									"opus/silk/decode_frame.c",
 | 
				
			||||||
 | 
									"opus/silk/float/inner_product_FLP.c",
 | 
				
			||||||
 | 
									"opus/silk/float/scale_vector_FLP.c",
 | 
				
			||||||
 | 
									"opus/silk/float/find_pred_coefs_FLP.c",
 | 
				
			||||||
 | 
									"opus/silk/float/schur_FLP.c",
 | 
				
			||||||
 | 
									"opus/silk/float/warped_autocorrelation_FLP.c",
 | 
				
			||||||
 | 
									"opus/silk/float/burg_modified_FLP.c",
 | 
				
			||||||
 | 
									"opus/silk/float/find_LPC_FLP.c",
 | 
				
			||||||
 | 
									"opus/silk/float/LPC_inv_pred_gain_FLP.c",
 | 
				
			||||||
 | 
									"opus/silk/float/scale_copy_vector_FLP.c",
 | 
				
			||||||
 | 
									"opus/silk/float/noise_shape_analysis_FLP.c",
 | 
				
			||||||
 | 
									"opus/silk/float/pitch_analysis_core_FLP.c",
 | 
				
			||||||
 | 
									"opus/silk/float/bwexpander_FLP.c",
 | 
				
			||||||
 | 
									"opus/silk/float/LTP_analysis_filter_FLP.c",
 | 
				
			||||||
 | 
									"opus/silk/float/LTP_scale_ctrl_FLP.c",
 | 
				
			||||||
 | 
									"opus/silk/float/corrMatrix_FLP.c",
 | 
				
			||||||
 | 
									"opus/silk/float/encode_frame_FLP.c",
 | 
				
			||||||
 | 
									"opus/silk/float/sort_FLP.c",
 | 
				
			||||||
 | 
									"opus/silk/float/find_pitch_lags_FLP.c",
 | 
				
			||||||
 | 
									"opus/silk/float/residual_energy_FLP.c",
 | 
				
			||||||
 | 
									"opus/silk/float/LPC_analysis_filter_FLP.c",
 | 
				
			||||||
 | 
									"opus/silk/float/autocorrelation_FLP.c",
 | 
				
			||||||
 | 
									"opus/silk/float/k2a_FLP.c",
 | 
				
			||||||
 | 
									"opus/silk/float/regularize_correlations_FLP.c",
 | 
				
			||||||
 | 
									"opus/silk/float/find_LTP_FLP.c",
 | 
				
			||||||
 | 
									"opus/silk/float/energy_FLP.c",
 | 
				
			||||||
 | 
									"opus/silk/float/apply_sine_window_FLP.c",
 | 
				
			||||||
 | 
									"opus/silk/float/wrappers_FLP.c",
 | 
				
			||||||
 | 
									"opus/silk/float/process_gains_FLP.c",
 | 
				
			||||||
 | 
									"opus/silk/stereo_quant_pred.c",
 | 
				
			||||||
 | 
									"opus/silk/LPC_inv_pred_gain.c",
 | 
				
			||||||
 | 
									"opus/silk/process_NLSFs.c",
 | 
				
			||||||
 | 
									"opus/silk/NSQ.c",
 | 
				
			||||||
 | 
									"opus/silk/check_control_input.c",
 | 
				
			||||||
 | 
									"opus/silk/NLSF_del_dec_quant.c",
 | 
				
			||||||
 | 
									"opus/silk/LPC_analysis_filter.c",
 | 
				
			||||||
 | 
									"opus/silk/dec_API.c",
 | 
				
			||||||
 | 
									"opus/silk/resampler.c",
 | 
				
			||||||
 | 
									"opus/silk/sort.c",
 | 
				
			||||||
 | 
									"opus/silk/VAD.c",
 | 
				
			||||||
 | 
									"opus/silk/resampler_private_AR2.c",
 | 
				
			||||||
 | 
									"opus/silk/LPC_fit.c",
 | 
				
			||||||
 | 
									"opus/silk/control_SNR.c",
 | 
				
			||||||
 | 
									"opus/silk/decode_parameters.c",
 | 
				
			||||||
 | 
									"opus/silk/pitch_est_tables.c",
 | 
				
			||||||
 | 
									"opus/silk/fixed/warped_autocorrelation_FIX.c",
 | 
				
			||||||
 | 
									"opus/silk/fixed/apply_sine_window_FIX.c",
 | 
				
			||||||
 | 
									"opus/silk/fixed/residual_energy16_FIX.c",
 | 
				
			||||||
 | 
									"opus/silk/fixed/schur64_FIX.c",
 | 
				
			||||||
 | 
									"opus/silk/fixed/residual_energy_FIX.c",
 | 
				
			||||||
 | 
									"opus/silk/fixed/noise_shape_analysis_FIX.c",
 | 
				
			||||||
 | 
									"opus/silk/fixed/encode_frame_FIX.c",
 | 
				
			||||||
 | 
									"opus/silk/fixed/schur_FIX.c",
 | 
				
			||||||
 | 
									"opus/silk/fixed/autocorr_FIX.c",
 | 
				
			||||||
 | 
									"opus/silk/fixed/burg_modified_FIX.c",
 | 
				
			||||||
 | 
									"opus/silk/fixed/pitch_analysis_core_FIX.c",
 | 
				
			||||||
 | 
									"opus/silk/fixed/find_LTP_FIX.c",
 | 
				
			||||||
 | 
									"opus/silk/fixed/find_LPC_FIX.c",
 | 
				
			||||||
 | 
									"opus/silk/fixed/corrMatrix_FIX.c",
 | 
				
			||||||
 | 
									"opus/silk/fixed/k2a_FIX.c",
 | 
				
			||||||
 | 
									"opus/silk/fixed/LTP_scale_ctrl_FIX.c",
 | 
				
			||||||
 | 
									"opus/silk/fixed/process_gains_FIX.c",
 | 
				
			||||||
 | 
									"opus/silk/fixed/k2a_Q16_FIX.c",
 | 
				
			||||||
 | 
									"opus/silk/fixed/regularize_correlations_FIX.c",
 | 
				
			||||||
 | 
									"opus/silk/fixed/LTP_analysis_filter_FIX.c",
 | 
				
			||||||
 | 
									"opus/silk/fixed/vector_ops_FIX.c",
 | 
				
			||||||
 | 
									"opus/silk/fixed/find_pitch_lags_FIX.c",
 | 
				
			||||||
 | 
									"opus/silk/fixed/find_pred_coefs_FIX.c",
 | 
				
			||||||
 | 
									"opus/silk/control_audio_bandwidth.c",
 | 
				
			||||||
 | 
									"opus/silk/decoder_set_fs.c",
 | 
				
			||||||
 | 
									"opus/silk/NLSF_unpack.c",
 | 
				
			||||||
 | 
									"opus/silk/bwexpander.c",
 | 
				
			||||||
 | 
									"opus/silk/resampler_rom.c",
 | 
				
			||||||
 | 
									"opus/silk/shell_coder.c",
 | 
				
			||||||
 | 
									"opus/silk/decode_pulses.c",
 | 
				
			||||||
 | 
									"opus/silk/bwexpander_32.c",
 | 
				
			||||||
 | 
									"opus/silk/decode_core.c",
 | 
				
			||||||
 | 
									"opus/silk/PLC.c",
 | 
				
			||||||
 | 
									"opus/silk/tables_NLSF_CB_WB.c",
 | 
				
			||||||
 | 
									"opus/silk/table_LSF_cos.c",
 | 
				
			||||||
 | 
									"opus/silk/tables_pulses_per_block.c",
 | 
				
			||||||
 | 
									"opus/silk/tables_gain.c",
 | 
				
			||||||
 | 
									"opus/silk/inner_prod_aligned.c",
 | 
				
			||||||
 | 
									"opus/silk/resampler_down2_3.c",
 | 
				
			||||||
 | 
									"opus/silk/NSQ_del_dec.c",
 | 
				
			||||||
 | 
									"opus/silk/decode_pitch.c",
 | 
				
			||||||
 | 
									"opus/silk/NLSF_VQ_weights_laroia.c",
 | 
				
			||||||
 | 
									"opus/silk/interpolate.c",
 | 
				
			||||||
 | 
									"opus/silk/debug.c",
 | 
				
			||||||
 | 
									"opus/silk/tables_other.c",
 | 
				
			||||||
 | 
									"opus/silk/LP_variable_cutoff.c",
 | 
				
			||||||
 | 
									"opus/silk/NLSF_decode.c",
 | 
				
			||||||
 | 
									"opus/silk/encode_pulses.c",
 | 
				
			||||||
 | 
									"opus/silk/control_codec.c",
 | 
				
			||||||
 | 
									"opus/silk/stereo_LR_to_MS.c",
 | 
				
			||||||
 | 
									"opus/silk/HP_variable_cutoff.c",
 | 
				
			||||||
 | 
									"opus/silk/encode_indices.c",
 | 
				
			||||||
 | 
									"opus/silk/init_decoder.c",
 | 
				
			||||||
 | 
									"opus/silk/stereo_encode_pred.c",
 | 
				
			||||||
 | 
									"opus/silk/NLSF_VQ.c",
 | 
				
			||||||
 | 
									"opus/silk/init_encoder.c",
 | 
				
			||||||
 | 
									"opus/silk/resampler_private_IIR_FIR.c",
 | 
				
			||||||
 | 
									"opus/silk/resampler_private_up2_HQ.c",
 | 
				
			||||||
 | 
									"opus/silk/sigm_Q15.c",
 | 
				
			||||||
 | 
									"opus/silk/sum_sqr_shift.c",
 | 
				
			||||||
 | 
									"opus/silk/tables_LTP.c",
 | 
				
			||||||
 | 
									"opus/silk/resampler_down2.c",
 | 
				
			||||||
 | 
									"opus/silk/code_signs.c",
 | 
				
			||||||
 | 
									"opus/silk/tables_NLSF_CB_NB_MB.c",
 | 
				
			||||||
 | 
									"opus/silk/gain_quant.c",
 | 
				
			||||||
 | 
									"opus/silk/tables_pitch_lag.c",
 | 
				
			||||||
 | 
									"opus/silk/NLSF_stabilize.c",
 | 
				
			||||||
 | 
									"opus/silk/stereo_find_predictor.c",
 | 
				
			||||||
 | 
									"opus/silk/A2NLSF.c",
 | 
				
			||||||
 | 
									"opus/silk/NLSF2A.c",
 | 
				
			||||||
 | 
									"opus/silk/VQ_WMat_EC.c",
 | 
				
			||||||
 | 
									"opus/silk/NLSF_encode.c",
 | 
				
			||||||
 | 
									"opus/silk/log2lin.c",
 | 
				
			||||||
 | 
									"opus/silk/stereo_decode_pred.c",
 | 
				
			||||||
 | 
									"opus/silk/lin2log.c",
 | 
				
			||||||
 | 
									"opus/silk/CNG.c",
 | 
				
			||||||
 | 
									"opus/silk/enc_API.c",
 | 
				
			||||||
 | 
									"opus/silk/biquad_alt.c",
 | 
				
			||||||
 | 
									"opus/silk/quant_LTP_gains.c",
 | 
				
			||||||
 | 
									"opus/silk/resampler_private_down_FIR.c",
 | 
				
			||||||
 | 
									"opus/silk/ana_filt_bank_1.c",
 | 
				
			||||||
 | 
									"opus/silk/stereo_MS_to_LR.c",
 | 
				
			||||||
 | 
									"opus/silk/decode_indices.c",
 | 
				
			||||||
 | 
									"opus/celt/rate.c",
 | 
				
			||||||
 | 
									"opus/celt/entdec.c",
 | 
				
			||||||
 | 
									"opus/celt/modes.c",
 | 
				
			||||||
 | 
									"opus/celt/celt_lpc.c",
 | 
				
			||||||
 | 
									"opus/celt/laplace.c",
 | 
				
			||||||
 | 
									"opus/celt/cwrs.c",
 | 
				
			||||||
 | 
									"opus/celt/celt.c",
 | 
				
			||||||
 | 
									"opus/celt/entcode.c",
 | 
				
			||||||
 | 
									"opus/celt/celt_decoder.c",
 | 
				
			||||||
 | 
									"opus/celt/celt_encoder.c",
 | 
				
			||||||
 | 
									"opus/celt/mdct.c",
 | 
				
			||||||
 | 
									"opus/celt/quant_bands.c",
 | 
				
			||||||
 | 
									"opus/celt/vq.c",
 | 
				
			||||||
 | 
									"opus/celt/bands.c",
 | 
				
			||||||
 | 
									"opus/celt/kiss_fft.c",
 | 
				
			||||||
 | 
									"opus/celt/entenc.c",
 | 
				
			||||||
 | 
									"opus/celt/mathops.c",
 | 
				
			||||||
 | 
									"opus/celt/pitch.c",
 | 
				
			||||||
 | 
								],
 | 
				
			||||||
 | 
								"cflags": [
 | 
				
			||||||
 | 
									"-fvisibility=hidden",
 | 
				
			||||||
 | 
									"-W",
 | 
				
			||||||
 | 
									"-Wstrict-prototypes",
 | 
				
			||||||
 | 
									"-Wall",
 | 
				
			||||||
 | 
									"-Wextra",
 | 
				
			||||||
 | 
									"-Wcast-align",
 | 
				
			||||||
 | 
									"-Wnested-externs",
 | 
				
			||||||
 | 
									"-Wshadow",
 | 
				
			||||||
 | 
									"-Wno-parentheses",
 | 
				
			||||||
 | 
									"-Wno-unused-parameter",
 | 
				
			||||||
 | 
									"-Wno-sign-compare",
 | 
				
			||||||
 | 
									"-Wno-maybe-uninitialized",
 | 
				
			||||||
 | 
								],
 | 
				
			||||||
 | 
								"include_dirs": [
 | 
				
			||||||
 | 
									"config/opus/<(OS)/<(target_arch)",
 | 
				
			||||||
 | 
									"opus/include",
 | 
				
			||||||
 | 
									"opus/celt",
 | 
				
			||||||
 | 
									"opus/silk",
 | 
				
			||||||
 | 
									"opus/silk/float",
 | 
				
			||||||
 | 
								],
 | 
				
			||||||
 | 
								"defines": [
 | 
				
			||||||
 | 
									"PIC",
 | 
				
			||||||
 | 
									"HAVE_CONFIG_H",
 | 
				
			||||||
 | 
								],
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						],
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -152,7 +152,7 @@
 | 
				
			|||||||
#define PACKAGE_NAME "opus"
 | 
					#define PACKAGE_NAME "opus"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to the full name and version of this package. */
 | 
					/* Define to the full name and version of this package. */
 | 
				
			||||||
#define PACKAGE_STRING "opus 1.1.2"
 | 
					#define PACKAGE_STRING "opus 1.3.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to the one symbol short name of this package. */
 | 
					/* Define to the one symbol short name of this package. */
 | 
				
			||||||
#define PACKAGE_TARNAME "opus"
 | 
					#define PACKAGE_TARNAME "opus"
 | 
				
			||||||
@@ -161,7 +161,7 @@
 | 
				
			|||||||
#define PACKAGE_URL ""
 | 
					#define PACKAGE_URL ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to the version of this package. */
 | 
					/* Define to the version of this package. */
 | 
				
			||||||
#define PACKAGE_VERSION "1.1.2"
 | 
					#define PACKAGE_VERSION "1.3.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to 1 if you have the ANSI C header files. */
 | 
					/* Define to 1 if you have the ANSI C header files. */
 | 
				
			||||||
#define STDC_HEADERS 1
 | 
					#define STDC_HEADERS 1
 | 
				
			||||||
@@ -153,7 +153,7 @@
 | 
				
			|||||||
#define PACKAGE_NAME "opus"
 | 
					#define PACKAGE_NAME "opus"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to the full name and version of this package. */
 | 
					/* Define to the full name and version of this package. */
 | 
				
			||||||
#define PACKAGE_STRING "opus 1.1.2"
 | 
					#define PACKAGE_STRING "opus 1.3.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to the one symbol short name of this package. */
 | 
					/* Define to the one symbol short name of this package. */
 | 
				
			||||||
#define PACKAGE_TARNAME "opus"
 | 
					#define PACKAGE_TARNAME "opus"
 | 
				
			||||||
@@ -162,7 +162,7 @@
 | 
				
			|||||||
#define PACKAGE_URL ""
 | 
					#define PACKAGE_URL ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to the version of this package. */
 | 
					/* Define to the version of this package. */
 | 
				
			||||||
#define PACKAGE_VERSION "1.1.2"
 | 
					#define PACKAGE_VERSION "1.3.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to 1 if you have the ANSI C header files. */
 | 
					/* Define to 1 if you have the ANSI C header files. */
 | 
				
			||||||
#define STDC_HEADERS 1
 | 
					#define STDC_HEADERS 1
 | 
				
			||||||
@@ -132,7 +132,7 @@
 | 
				
			|||||||
#define PACKAGE_NAME "opus"
 | 
					#define PACKAGE_NAME "opus"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to the full name and version of this package. */
 | 
					/* Define to the full name and version of this package. */
 | 
				
			||||||
#define PACKAGE_STRING "opus 1.1.1-beta-34-g5b20cb0"
 | 
					#define PACKAGE_STRING "opus 1.3.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to the one symbol short name of this package. */
 | 
					/* Define to the one symbol short name of this package. */
 | 
				
			||||||
#define PACKAGE_TARNAME "opus"
 | 
					#define PACKAGE_TARNAME "opus"
 | 
				
			||||||
@@ -141,7 +141,7 @@
 | 
				
			|||||||
#define PACKAGE_URL ""
 | 
					#define PACKAGE_URL ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to the version of this package. */
 | 
					/* Define to the version of this package. */
 | 
				
			||||||
#define PACKAGE_VERSION "1.1.1-beta-34-g5b20cb0"
 | 
					#define PACKAGE_VERSION "1.3.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to 1 if you have the ANSI C header files. */
 | 
					/* Define to 1 if you have the ANSI C header files. */
 | 
				
			||||||
#define STDC_HEADERS 1
 | 
					#define STDC_HEADERS 1
 | 
				
			||||||
@@ -152,7 +152,7 @@
 | 
				
			|||||||
#define PACKAGE_NAME "opus"
 | 
					#define PACKAGE_NAME "opus"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to the full name and version of this package. */
 | 
					/* Define to the full name and version of this package. */
 | 
				
			||||||
#define PACKAGE_STRING "opus 1.1.2"
 | 
					#define PACKAGE_STRING "opus 1.3.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to the one symbol short name of this package. */
 | 
					/* Define to the one symbol short name of this package. */
 | 
				
			||||||
#define PACKAGE_TARNAME "opus"
 | 
					#define PACKAGE_TARNAME "opus"
 | 
				
			||||||
@@ -161,7 +161,7 @@
 | 
				
			|||||||
#define PACKAGE_URL ""
 | 
					#define PACKAGE_URL ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to the version of this package. */
 | 
					/* Define to the version of this package. */
 | 
				
			||||||
#define PACKAGE_VERSION "1.1.2"
 | 
					#define PACKAGE_VERSION "1.3.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to 1 if you have the ANSI C header files. */
 | 
					/* Define to 1 if you have the ANSI C header files. */
 | 
				
			||||||
#define STDC_HEADERS 1
 | 
					#define STDC_HEADERS 1
 | 
				
			||||||
@@ -128,7 +128,7 @@
 | 
				
			|||||||
#define PACKAGE_NAME "opus"
 | 
					#define PACKAGE_NAME "opus"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to the full name and version of this package. */
 | 
					/* Define to the full name and version of this package. */
 | 
				
			||||||
#define PACKAGE_STRING "opus unknown"
 | 
					#define PACKAGE_STRING "opus 1.3.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to the one symbol short name of this package. */
 | 
					/* Define to the one symbol short name of this package. */
 | 
				
			||||||
#define PACKAGE_TARNAME "opus"
 | 
					#define PACKAGE_TARNAME "opus"
 | 
				
			||||||
@@ -137,7 +137,7 @@
 | 
				
			|||||||
#define PACKAGE_URL ""
 | 
					#define PACKAGE_URL ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to the version of this package. */
 | 
					/* Define to the version of this package. */
 | 
				
			||||||
#define PACKAGE_VERSION "unknown"
 | 
					#define PACKAGE_VERSION "1.3.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to 1 if you have the ANSI C header files. */
 | 
					/* Define to 1 if you have the ANSI C header files. */
 | 
				
			||||||
#define STDC_HEADERS 1
 | 
					#define STDC_HEADERS 1
 | 
				
			||||||
@@ -129,7 +129,7 @@
 | 
				
			|||||||
#define PACKAGE_NAME "opus"
 | 
					#define PACKAGE_NAME "opus"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to the full name and version of this package. */
 | 
					/* Define to the full name and version of this package. */
 | 
				
			||||||
#define PACKAGE_STRING "opus 1.1.1-beta-34-g5b20cb0"
 | 
					#define PACKAGE_STRING "opus 1.3.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to the one symbol short name of this package. */
 | 
					/* Define to the one symbol short name of this package. */
 | 
				
			||||||
#define PACKAGE_TARNAME "opus"
 | 
					#define PACKAGE_TARNAME "opus"
 | 
				
			||||||
@@ -138,7 +138,7 @@
 | 
				
			|||||||
#define PACKAGE_URL ""
 | 
					#define PACKAGE_URL ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to the version of this package. */
 | 
					/* Define to the version of this package. */
 | 
				
			||||||
#define PACKAGE_VERSION "1.1.1-beta-34-g5b20cb0"
 | 
					#define PACKAGE_VERSION "1.3.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to 1 if you have the ANSI C header files. */
 | 
					/* Define to 1 if you have the ANSI C header files. */
 | 
				
			||||||
#define STDC_HEADERS 1
 | 
					#define STDC_HEADERS 1
 | 
				
			||||||
@@ -128,7 +128,7 @@
 | 
				
			|||||||
#define PACKAGE_NAME "opus"
 | 
					#define PACKAGE_NAME "opus"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to the full name and version of this package. */
 | 
					/* Define to the full name and version of this package. */
 | 
				
			||||||
#define PACKAGE_STRING "opus 1.1.1-beta-34-g5b20cb0"
 | 
					#define PACKAGE_STRING "opus 1.3.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to the one symbol short name of this package. */
 | 
					/* Define to the one symbol short name of this package. */
 | 
				
			||||||
#define PACKAGE_TARNAME "opus"
 | 
					#define PACKAGE_TARNAME "opus"
 | 
				
			||||||
@@ -137,7 +137,7 @@
 | 
				
			|||||||
#define PACKAGE_URL ""
 | 
					#define PACKAGE_URL ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to the version of this package. */
 | 
					/* Define to the version of this package. */
 | 
				
			||||||
#define PACKAGE_VERSION "1.1.1-beta-34-g5b20cb0"
 | 
					#define PACKAGE_VERSION "1.3.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Define to 1 if you have the ANSI C header files. */
 | 
					/* Define to 1 if you have the ANSI C header files. */
 | 
				
			||||||
#define STDC_HEADERS 1
 | 
					#define STDC_HEADERS 1
 | 
				
			||||||
@@ -28,8 +28,6 @@ POSSIBILITY OF SUCH DAMAGE.
 | 
				
			|||||||
#ifndef CONFIG_H
 | 
					#ifndef CONFIG_H
 | 
				
			||||||
#define CONFIG_H
 | 
					#define CONFIG_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define inline __inline
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define USE_ALLOCA            1
 | 
					#define USE_ALLOCA            1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Comment out the next line for floating-point code */
 | 
					/* Comment out the next line for floating-point code */
 | 
				
			||||||
@@ -37,16 +35,30 @@ POSSIBILITY OF SUCH DAMAGE.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#define OPUS_BUILD            1
 | 
					#define OPUS_BUILD            1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Get rid of the CELT VS compile warnings */
 | 
					#if defined(_M_IX86) || defined(_M_X64)
 | 
				
			||||||
#if 1
 | 
					/* Can always compile SSE intrinsics (no special compiler flags necessary) */
 | 
				
			||||||
#pragma warning(disable : 4996)/* This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. */
 | 
					/* #define OPUS_X86_MAY_HAVE_SSE
 | 
				
			||||||
 | 
					#define OPUS_X86_MAY_HAVE_SSE2
 | 
				
			||||||
 | 
					#define OPUS_X86_MAY_HAVE_SSE4_1 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Presume SSE functions, if compiled to use SSE/SSE2/AVX (note that AMD64 implies SSE2, and AVX
 | 
				
			||||||
 | 
					   implies SSE4.1) */
 | 
				
			||||||
 | 
					#if defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 1)) || defined(__AVX__)
 | 
				
			||||||
 | 
					#define OPUS_X86_PRESUME_SSE 1
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#if defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 2)) || defined(__AVX__)
 | 
				
			||||||
 | 
					#define OPUS_X86_PRESUME_SSE2 1
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#if defined(__AVX__)
 | 
				
			||||||
 | 
					#define OPUS_X86_PRESUME_SSE4_1 1
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Enable SSE functions, if compiled with SSE/SSE2 (note that AMD64 implies SSE2) */
 | 
					#if !defined(OPUS_X86_PRESUME_SSE4_1) || !defined(OPUS_X86_PRESUME_SSE2) || !defined(OPUS_X86_PRESUME_SSE)
 | 
				
			||||||
#if defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 1))
 | 
					#define OPUS_HAVE_RTCD 1
 | 
				
			||||||
#define __SSE__               1
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "version.h"
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define PACKAGE_VERSION "1.3.1"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* CONFIG_H */
 | 
					#endif /* CONFIG_H */
 | 
				
			||||||
							
								
								
									
										411
									
								
								node_modules/@discordjs/opus/deps/opus/CMakeLists.txt
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										411
									
								
								node_modules/@discordjs/opus/deps/opus/CMakeLists.txt
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,411 @@
 | 
				
			|||||||
 | 
					cmake_minimum_required(VERSION 3.1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					include(opus_functions.cmake)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					get_library_version(OPUS_LIBRARY_VERSION OPUS_LIBRARY_VERSION_MAJOR)
 | 
				
			||||||
 | 
					message(STATUS "Opus library version: ${OPUS_LIBRARY_VERSION}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					get_package_version(PACKAGE_VERSION)
 | 
				
			||||||
 | 
					message(STATUS "Opus package version: ${PACKAGE_VERSION}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					string(REGEX
 | 
				
			||||||
 | 
					       REPLACE "^([0-9]+.[0-9]+\\.?([0-9]+)?).*"
 | 
				
			||||||
 | 
					               "\\1"
 | 
				
			||||||
 | 
					               PROJECT_VERSION
 | 
				
			||||||
 | 
					               ${PACKAGE_VERSION})
 | 
				
			||||||
 | 
					message(STATUS "Opus project version: ${PROJECT_VERSION}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					project(Opus LANGUAGES C VERSION ${PROJECT_VERSION})
 | 
				
			||||||
 | 
					include(opus_buildtype.cmake)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					option(OPUS_STACK_PROTECTOR "Use stack protection" ON)
 | 
				
			||||||
 | 
					option(OPUS_USE_ALLOCA "Use alloca for stack arrays (on non-C99 compilers)" OFF)
 | 
				
			||||||
 | 
					option(OPUS_CUSTOM_MODES "Enable non-Opus modes, e.g. 44.1 kHz & 2^n frames"
 | 
				
			||||||
 | 
					       OFF)
 | 
				
			||||||
 | 
					option(OPUS_BUILD_PROGRAMS "Build programs" OFF)
 | 
				
			||||||
 | 
					option(OPUS_FIXED_POINT
 | 
				
			||||||
 | 
					       "Compile as fixed-point (for machines without a fast enough FPU)" OFF)
 | 
				
			||||||
 | 
					option(OPUS_ENABLE_FLOAT_API
 | 
				
			||||||
 | 
					       "Compile with the floating point API (for machines with float library"
 | 
				
			||||||
 | 
					       ON)
 | 
				
			||||||
 | 
					option(OPUS_INSTALL_PKG_CONFIG_MODULE "Install PkgConfig module" ON)
 | 
				
			||||||
 | 
					option(OPUS_INSTALL_CMAKE_CONFIG_MODULE "Install CMake package config module"
 | 
				
			||||||
 | 
					       ON)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					include(opus_config.cmake)
 | 
				
			||||||
 | 
					include(opus_sources.cmake)
 | 
				
			||||||
 | 
					include(GNUInstallDirs)
 | 
				
			||||||
 | 
					include(CMakeDependentOption)
 | 
				
			||||||
 | 
					include(FeatureSummary)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if(OPUS_STACK_PROTECTOR)
 | 
				
			||||||
 | 
					  if(NOT MSVC) # GC on by default on MSVC
 | 
				
			||||||
 | 
					    check_and_set_flag(STACK_PROTECTION_STRONG -fstack-protector-strong)
 | 
				
			||||||
 | 
					  endif()
 | 
				
			||||||
 | 
					else()
 | 
				
			||||||
 | 
					  if(MSVC)
 | 
				
			||||||
 | 
					    check_and_set_flag(BUFFER_SECURITY_CHECK /GS-)
 | 
				
			||||||
 | 
					  endif()
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if(OPUS_CPU_X86 OR OPUS_CPU_X64)
 | 
				
			||||||
 | 
					  cmake_dependent_option(OPUS_X86_MAY_HAVE_SSE
 | 
				
			||||||
 | 
					                         "Does runtime check for SSE1 support"
 | 
				
			||||||
 | 
					                         ON
 | 
				
			||||||
 | 
					                         "SSE1_SUPPORTED"
 | 
				
			||||||
 | 
					                         OFF)
 | 
				
			||||||
 | 
					  cmake_dependent_option(OPUS_X86_MAY_HAVE_SSE2
 | 
				
			||||||
 | 
					                         "Does runtime check for SSE2 support"
 | 
				
			||||||
 | 
					                         ON
 | 
				
			||||||
 | 
					                         "SSE2_SUPPORTED"
 | 
				
			||||||
 | 
					                         OFF)
 | 
				
			||||||
 | 
					  cmake_dependent_option(OPUS_X86_MAY_HAVE_SSE4_1
 | 
				
			||||||
 | 
					                         "Does runtime check for SSE4.1 support"
 | 
				
			||||||
 | 
					                         ON
 | 
				
			||||||
 | 
					                         "SSE4_1_SUPPORTED"
 | 
				
			||||||
 | 
					                         OFF)
 | 
				
			||||||
 | 
					  cmake_dependent_option(OPUS_X86_MAY_HAVE_AVX
 | 
				
			||||||
 | 
					                         "Does runtime check for AVX support"
 | 
				
			||||||
 | 
					                         ON
 | 
				
			||||||
 | 
					                         "AVX_SUPPORTED"
 | 
				
			||||||
 | 
					                         OFF)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if(OPUS_CPU_X64) # Assume 64 bit has SSE2 support
 | 
				
			||||||
 | 
					    cmake_dependent_option(OPUS_X86_PRESUME_SSE
 | 
				
			||||||
 | 
					                           "Assume target CPU has SSE1 support"
 | 
				
			||||||
 | 
					                           ON
 | 
				
			||||||
 | 
					                           "OPUS_X86_MAY_HAVE_SSE"
 | 
				
			||||||
 | 
					                           OFF)
 | 
				
			||||||
 | 
					    cmake_dependent_option(OPUS_X86_PRESUME_SSE2
 | 
				
			||||||
 | 
					                           "Assume target CPU has SSE2 support"
 | 
				
			||||||
 | 
					                           ON
 | 
				
			||||||
 | 
					                           "OPUS_X86_MAY_HAVE_SSE2"
 | 
				
			||||||
 | 
					                           OFF)
 | 
				
			||||||
 | 
					  else()
 | 
				
			||||||
 | 
					    cmake_dependent_option(OPUS_X86_PRESUME_SSE
 | 
				
			||||||
 | 
					                           "Assume target CPU has SSE1 support"
 | 
				
			||||||
 | 
					                           OFF
 | 
				
			||||||
 | 
					                           "OPUS_X86_MAY_HAVE_SSE"
 | 
				
			||||||
 | 
					                           OFF)
 | 
				
			||||||
 | 
					    cmake_dependent_option(OPUS_X86_PRESUME_SSE2
 | 
				
			||||||
 | 
					                           "Assume target CPU has SSE2 support"
 | 
				
			||||||
 | 
					                           OFF
 | 
				
			||||||
 | 
					                           "OPUS_X86_MAY_HAVE_SSE2"
 | 
				
			||||||
 | 
					                           OFF)
 | 
				
			||||||
 | 
					  endif()
 | 
				
			||||||
 | 
					  cmake_dependent_option(OPUS_X86_PRESUME_SSE4_1
 | 
				
			||||||
 | 
					                         "Assume target CPU has SSE4.1 support"
 | 
				
			||||||
 | 
					                         OFF
 | 
				
			||||||
 | 
					                         "OPUS_X86_MAY_HAVE_SSE4_1"
 | 
				
			||||||
 | 
					                         OFF)
 | 
				
			||||||
 | 
					  cmake_dependent_option(OPUS_X86_PRESUME_AVX
 | 
				
			||||||
 | 
					                         "Assume target CPU has AVX support"
 | 
				
			||||||
 | 
					                         OFF
 | 
				
			||||||
 | 
					                         "OPUS_X86_MAY_HAVE_AVX"
 | 
				
			||||||
 | 
					                         OFF)
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set_package_properties(Git
 | 
				
			||||||
 | 
					                       PROPERTIES
 | 
				
			||||||
 | 
					                       TYPE
 | 
				
			||||||
 | 
					                       REQUIRED
 | 
				
			||||||
 | 
					                       DESCRIPTION
 | 
				
			||||||
 | 
					                       "fast, scalable, distributed revision control system"
 | 
				
			||||||
 | 
					                       URL
 | 
				
			||||||
 | 
					                       "https://git-scm.com/"
 | 
				
			||||||
 | 
					                       PURPOSE
 | 
				
			||||||
 | 
					                       "required to set up package version")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					add_feature_info(STACK_PROTECTOR OPUS_STACK_PROTECTOR "Use stack protection")
 | 
				
			||||||
 | 
					add_feature_info(USE_ALLOCA OPUS_USE_ALLOCA
 | 
				
			||||||
 | 
					                 "Use alloca for stack arrays (on non-C99 compilers)")
 | 
				
			||||||
 | 
					add_feature_info(CUSTOM_MODES OPUS_CUSTOM_MODES
 | 
				
			||||||
 | 
					                 "Enable non-Opus modes, e.g. 44.1 kHz & 2^n frames")
 | 
				
			||||||
 | 
					add_feature_info(BUILD_PROGRAMS OPUS_BUILD_PROGRAMS "Build programs")
 | 
				
			||||||
 | 
					add_feature_info(
 | 
				
			||||||
 | 
					  FIXED_POINT OPUS_FIXED_POINT
 | 
				
			||||||
 | 
					  "compile as fixed-point (for machines without a fast enough FPU)")
 | 
				
			||||||
 | 
					add_feature_info(
 | 
				
			||||||
 | 
					  FLOAT_API OPUS_ENABLE_FLOAT_API
 | 
				
			||||||
 | 
					  "compile with the floating point API (for machines with float library)")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					add_feature_info(INSTALL_PKG_CONFIG_MODULE OPUS_INSTALL_PKG_CONFIG_MODULE
 | 
				
			||||||
 | 
					                 "install PkgConfig module")
 | 
				
			||||||
 | 
					add_feature_info(INSTALL_CMAKE_CONFIG_MODULE OPUS_INSTALL_CMAKE_CONFIG_MODULE
 | 
				
			||||||
 | 
					                 "install CMake package config module")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if(OPUS_CPU_X86 OR OPUS_CPU_X64)
 | 
				
			||||||
 | 
					  add_feature_info(X86_MAY_HAVE_SSE OPUS_X86_MAY_HAVE_SSE
 | 
				
			||||||
 | 
					                   "does runtime check for SSE1 support")
 | 
				
			||||||
 | 
					  add_feature_info(X86_MAY_HAVE_SSE2 OPUS_X86_MAY_HAVE_SSE2
 | 
				
			||||||
 | 
					                   "does runtime check for SSE2 support")
 | 
				
			||||||
 | 
					  add_feature_info(X86_MAY_HAVE_SSE4_1 OPUS_X86_MAY_HAVE_SSE4_1
 | 
				
			||||||
 | 
					                   "does runtime check for SSE4_1 support")
 | 
				
			||||||
 | 
					  add_feature_info(X86_MAY_HAVE_AVX OPUS_X86_MAY_HAVE_AVX
 | 
				
			||||||
 | 
					                   "does runtime check for AVX support")
 | 
				
			||||||
 | 
					  add_feature_info(X86_PRESUME_SSE OPUS_X86_PRESUME_SSE
 | 
				
			||||||
 | 
					                   "assume target CPU has SSE1 support")
 | 
				
			||||||
 | 
					  add_feature_info(X86_PRESUME_SSE2 OPUS_X86_PRESUME_SSE2
 | 
				
			||||||
 | 
					                   "assume target CPU has SSE2 support")
 | 
				
			||||||
 | 
					  add_feature_info(X86_PRESUME_SSE4_1 OPUS_X86_PRESUME_SSE4_1
 | 
				
			||||||
 | 
					                   "assume target CPU has SSE4_1 support")
 | 
				
			||||||
 | 
					  add_feature_info(X86_PRESUME_AVX OPUS_X86_PRESUME_AVX
 | 
				
			||||||
 | 
					                   "assume target CPU has AVX support")
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					feature_summary(WHAT ALL)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					add_library(opus ${opus_sources} ${opus_sources_float})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set(Opus_PUBLIC_HEADER
 | 
				
			||||||
 | 
					    ${CMAKE_CURRENT_SOURCE_DIR}/include/opus.h
 | 
				
			||||||
 | 
					    ${CMAKE_CURRENT_SOURCE_DIR}/include/opus_custom.h
 | 
				
			||||||
 | 
					    ${CMAKE_CURRENT_SOURCE_DIR}/include/opus_defines.h
 | 
				
			||||||
 | 
					    ${CMAKE_CURRENT_SOURCE_DIR}/include/opus_multistream.h
 | 
				
			||||||
 | 
					    ${CMAKE_CURRENT_SOURCE_DIR}/include/opus_projection.h
 | 
				
			||||||
 | 
					    ${CMAKE_CURRENT_SOURCE_DIR}/include/opus_types.h)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set_target_properties(opus
 | 
				
			||||||
 | 
					                      PROPERTIES SOVERSION
 | 
				
			||||||
 | 
					                                 ${OPUS_LIBRARY_VERSION_MAJOR}
 | 
				
			||||||
 | 
					                                 VERSION
 | 
				
			||||||
 | 
					                                 ${OPUS_LIBRARY_VERSION}
 | 
				
			||||||
 | 
					                                 PUBLIC_HEADER
 | 
				
			||||||
 | 
					                                 "${Opus_PUBLIC_HEADER}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					target_include_directories(
 | 
				
			||||||
 | 
					  opus
 | 
				
			||||||
 | 
					  PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
 | 
				
			||||||
 | 
					         $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
 | 
				
			||||||
 | 
					  PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
 | 
				
			||||||
 | 
					          ${CMAKE_CURRENT_SOURCE_DIR}
 | 
				
			||||||
 | 
					          celt
 | 
				
			||||||
 | 
					          silk)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					target_link_libraries(opus PRIVATE ${OPUS_REQUIRED_LIBRARIES})
 | 
				
			||||||
 | 
					target_compile_definitions(opus PRIVATE OPUS_BUILD ENABLE_HARDENING)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if(NOT MSVC)
 | 
				
			||||||
 | 
					  target_compile_definitions(opus PRIVATE FORTIFY_SOURCE=2)
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# It is strongly recommended to uncomment one of these VAR_ARRAYS: Use C99
 | 
				
			||||||
 | 
					# variable-length arrays for stack allocation USE_ALLOCA: Use alloca() for stack
 | 
				
			||||||
 | 
					# allocation If none is defined, then the fallback is a non-threadsafe global
 | 
				
			||||||
 | 
					# array
 | 
				
			||||||
 | 
					if(OPUS_USE_ALLOCA OR MSVC)
 | 
				
			||||||
 | 
					  target_compile_definitions(opus PRIVATE USE_ALLOCA)
 | 
				
			||||||
 | 
					else()
 | 
				
			||||||
 | 
					  target_compile_definitions(opus PRIVATE VAR_ARRAYS)
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if(OPUS_CUSTOM_MODES)
 | 
				
			||||||
 | 
					  target_compile_definitions(opus PRIVATE CUSTOM_MODES)
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if(BUILD_SHARED_LIBS)
 | 
				
			||||||
 | 
					  if(WIN32)
 | 
				
			||||||
 | 
					    target_compile_definitions(opus PRIVATE DLL_EXPORT)
 | 
				
			||||||
 | 
					  else()
 | 
				
			||||||
 | 
					    include(CheckCCompilerFlag)
 | 
				
			||||||
 | 
					    check_c_compiler_flag(-fvisibility=hidden COMPILER_HAS_HIDDEN_VISIBILITY)
 | 
				
			||||||
 | 
					    if(COMPILER_HAS_HIDDEN_VISIBILITY)
 | 
				
			||||||
 | 
					      set_target_properties(opus PROPERTIES C_VISIBILITY_PRESET hidden)
 | 
				
			||||||
 | 
					    endif()
 | 
				
			||||||
 | 
					  endif()
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					add_sources_group(opus silk ${silk_sources})
 | 
				
			||||||
 | 
					add_sources_group(opus celt ${celt_sources})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if(OPUS_FIXED_POINT)
 | 
				
			||||||
 | 
					  add_sources_group(opus silk ${silk_sources_fixed})
 | 
				
			||||||
 | 
					  target_include_directories(opus PRIVATE silk/fixed)
 | 
				
			||||||
 | 
					  target_compile_definitions(opus PRIVATE FIXED_POINT=1)
 | 
				
			||||||
 | 
					else()
 | 
				
			||||||
 | 
					  add_sources_group(opus silk ${silk_sources_float})
 | 
				
			||||||
 | 
					  target_include_directories(opus PRIVATE silk/float)
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if(NOT OPUS_ENABLE_FLOAT_API)
 | 
				
			||||||
 | 
					  target_compile_definitions(opus PRIVATE DISABLE_FLOAT_API)
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if(OPUS_X86_MAY_HAVE_SSE
 | 
				
			||||||
 | 
					   OR OPUS_X86_MAY_HAVE_SSE2
 | 
				
			||||||
 | 
					   OR OPUS_X86_MAY_HAVE_SSE4_1
 | 
				
			||||||
 | 
					   OR OPUS_X86_MAY_HAVE_AVX)
 | 
				
			||||||
 | 
					  target_compile_definitions(opus PRIVATE OPUS_HAVE_RTCD)
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if(OPUS_X86_MAY_HAVE_SSE)
 | 
				
			||||||
 | 
					  add_sources_group(opus celt ${celt_sources_sse})
 | 
				
			||||||
 | 
					  target_compile_definitions(opus PRIVATE OPUS_X86_MAY_HAVE_SSE)
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					if(OPUS_X86_PRESUME_SSE)
 | 
				
			||||||
 | 
					  target_compile_definitions(opus PRIVATE OPUS_X86_PRESUME_SSE)
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if(OPUS_X86_MAY_HAVE_SSE2)
 | 
				
			||||||
 | 
					  add_sources_group(opus celt ${celt_sources_sse2})
 | 
				
			||||||
 | 
					  target_compile_definitions(opus PRIVATE OPUS_X86_MAY_HAVE_SSE2)
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					if(OPUS_X86_PRESUME_SSE2)
 | 
				
			||||||
 | 
					  target_compile_definitions(opus PRIVATE OPUS_X86_PRESUME_SSE2)
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if(OPUS_X86_MAY_HAVE_SSE)
 | 
				
			||||||
 | 
					  add_sources_group(opus celt ${celt_sources_sse4_1})
 | 
				
			||||||
 | 
					  add_sources_group(opus silk ${silk_sources_sse4_1})
 | 
				
			||||||
 | 
					  if(OPUS_FIXED_POINT)
 | 
				
			||||||
 | 
					    add_sources_group(opus silk ${silk_sources_fixed_sse4_1})
 | 
				
			||||||
 | 
					  endif()
 | 
				
			||||||
 | 
					  target_compile_definitions(opus PRIVATE OPUS_X86_MAY_HAVE_SSE4_1)
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					if(OPUS_X86_PRESUME_SSE4_1)
 | 
				
			||||||
 | 
					  target_compile_definitions(opus PRIVATE OPUS_X86_PRESUME_SSE4_1)
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if(CMAKE_SYSTEM_PROCESSOR MATCHES "(armv7-a)")
 | 
				
			||||||
 | 
					  add_sources_group(opus celt ${celt_sources_arm})
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if(COMPILER_SUPPORT_NEON AND OPUS_USE_NEON)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if(OPUS_MAY_HAVE_NEON)
 | 
				
			||||||
 | 
					    if(RUNTIME_CPU_CAPABILITY_DETECTION)
 | 
				
			||||||
 | 
					      message(STATUS "OPUS_MAY_HAVE_NEON enabling runtime detection")
 | 
				
			||||||
 | 
					      target_compile_definitions(opus PRIVATE OPUS_HAVE_RTCD)
 | 
				
			||||||
 | 
					    else()
 | 
				
			||||||
 | 
					      message(ERROR "Runtime cpu capability detection needed for MAY_HAVE_NEON")
 | 
				
			||||||
 | 
					    endif()
 | 
				
			||||||
 | 
					    # Do runtime check for NEON
 | 
				
			||||||
 | 
					    target_compile_definitions(opus
 | 
				
			||||||
 | 
					                               PRIVATE
 | 
				
			||||||
 | 
					                               OPUS_ARM_MAY_HAVE_NEON
 | 
				
			||||||
 | 
					                               OPUS_ARM_MAY_HAVE_NEON_INTR)
 | 
				
			||||||
 | 
					  endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  add_sources_group(opus celt ${celt_sources_arm_neon_intr})
 | 
				
			||||||
 | 
					  add_sources_group(opus silk ${silk_sources_arm_neon_intr})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # silk arm neon depends on main_Fix.h
 | 
				
			||||||
 | 
					  target_include_directories(opus PRIVATE silk/fixed)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if(OPUS_FIXED_POINT)
 | 
				
			||||||
 | 
					    add_sources_group(opus silk ${silk_sources_fixed_arm_neon_intr})
 | 
				
			||||||
 | 
					  endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if(OPUS_PRESUME_NEON)
 | 
				
			||||||
 | 
					    target_compile_definitions(opus
 | 
				
			||||||
 | 
					                               PRIVATE
 | 
				
			||||||
 | 
					                               OPUS_ARM_PRESUME_NEON
 | 
				
			||||||
 | 
					                               OPUS_ARM_PRESUME_NEON_INTR)
 | 
				
			||||||
 | 
					  endif()
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					install(TARGETS opus
 | 
				
			||||||
 | 
					        EXPORT OpusTargets
 | 
				
			||||||
 | 
					        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
 | 
				
			||||||
 | 
					        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
 | 
				
			||||||
 | 
					        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
 | 
				
			||||||
 | 
					        PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/opus)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if(OPUS_INSTALL_PKG_CONFIG_MODULE)
 | 
				
			||||||
 | 
					  set(prefix ${CMAKE_INSTALL_PREFIX})
 | 
				
			||||||
 | 
					  set(exec_prefix ${CMAKE_INSTALL_PREFIX})
 | 
				
			||||||
 | 
					  set(libdir ${CMAKE_INSTALL_FULL_LIBDIR})
 | 
				
			||||||
 | 
					  set(includedir ${CMAKE_INSTALL_FULL_INCLUDEDIR})
 | 
				
			||||||
 | 
					  set(VERSION ${OPUS_LIBRARY_VERSION})
 | 
				
			||||||
 | 
					  set(VERSION ${OPUS_LIBRARY_VERSION})
 | 
				
			||||||
 | 
					  if(HAVE_LIBM)
 | 
				
			||||||
 | 
					    set(LIBM "-lm")
 | 
				
			||||||
 | 
					  endif()
 | 
				
			||||||
 | 
					  configure_file(opus.pc.in opus.pc)
 | 
				
			||||||
 | 
					  install(FILES ${CMAKE_CURRENT_BINARY_DIR}/opus.pc
 | 
				
			||||||
 | 
					          DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if(OPUS_INSTALL_CMAKE_CONFIG_MODULE)
 | 
				
			||||||
 | 
					  set(CMAKE_INSTALL_PACKAGEDIR ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
 | 
				
			||||||
 | 
					  install(EXPORT OpusTargets
 | 
				
			||||||
 | 
					          NAMESPACE Opus::
 | 
				
			||||||
 | 
					          DESTINATION ${CMAKE_INSTALL_PACKAGEDIR})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  include(CMakePackageConfigHelpers)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR})
 | 
				
			||||||
 | 
					  configure_package_config_file(OpusConfig.cmake.in
 | 
				
			||||||
 | 
					                                OpusConfig.cmake
 | 
				
			||||||
 | 
					                                INSTALL_DESTINATION
 | 
				
			||||||
 | 
					                                ${CMAKE_INSTALL_PACKAGEDIR}
 | 
				
			||||||
 | 
					                                PATH_VARS
 | 
				
			||||||
 | 
					                                INCLUDE_INSTALL_DIR
 | 
				
			||||||
 | 
					                                INSTALL_PREFIX
 | 
				
			||||||
 | 
					                                ${CMAKE_INSTALL_PREFIX})
 | 
				
			||||||
 | 
					  write_basic_package_version_file(OpusConfigVersion.cmake
 | 
				
			||||||
 | 
					                                   VERSION ${PROJECT_VERSION}
 | 
				
			||||||
 | 
					                                   COMPATIBILITY SameMajorVersion)
 | 
				
			||||||
 | 
					  install(FILES ${CMAKE_CURRENT_BINARY_DIR}/OpusConfig.cmake
 | 
				
			||||||
 | 
					                ${CMAKE_CURRENT_BINARY_DIR}/OpusConfigVersion.cmake
 | 
				
			||||||
 | 
					          DESTINATION ${CMAKE_INSTALL_PACKAGEDIR})
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if(OPUS_BUILD_PROGRAMS)
 | 
				
			||||||
 | 
					  # demo
 | 
				
			||||||
 | 
					  if(OPUS_CUSTOM_MODES)
 | 
				
			||||||
 | 
					    add_executable(opus_custom_demo ${opus_custom_demo_sources})
 | 
				
			||||||
 | 
					    target_include_directories(opus_custom_demo
 | 
				
			||||||
 | 
					                               PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
 | 
				
			||||||
 | 
					    target_link_libraries(opus_custom_demo PRIVATE opus)
 | 
				
			||||||
 | 
					  endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  add_executable(opus_demo ${opus_demo_sources})
 | 
				
			||||||
 | 
					  target_include_directories(opus_demo PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
 | 
				
			||||||
 | 
					  target_include_directories(opus_demo PRIVATE silk) # debug.h
 | 
				
			||||||
 | 
					  target_include_directories(opus_demo PRIVATE celt) # arch.h
 | 
				
			||||||
 | 
					  target_link_libraries(opus_demo PRIVATE opus)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # compare
 | 
				
			||||||
 | 
					  add_executable(opus_compare ${opus_compare_sources})
 | 
				
			||||||
 | 
					  target_include_directories(opus_compare PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
 | 
				
			||||||
 | 
					  target_link_libraries(opus_compare PRIVATE opus)
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if(BUILD_TESTING)
 | 
				
			||||||
 | 
					  enable_testing()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  # tests
 | 
				
			||||||
 | 
					  add_executable(test_opus_decode ${test_opus_decode_sources})
 | 
				
			||||||
 | 
					  target_include_directories(test_opus_decode
 | 
				
			||||||
 | 
					                             PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
 | 
				
			||||||
 | 
					  target_link_libraries(test_opus_decode PRIVATE opus)
 | 
				
			||||||
 | 
					  if(OPUS_FIXED_POINT)
 | 
				
			||||||
 | 
					    target_compile_definitions(test_opus_decode PRIVATE DISABLE_FLOAT_API)
 | 
				
			||||||
 | 
					  endif()
 | 
				
			||||||
 | 
					  add_test(test_opus_decode test_opus_decode)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  add_executable(test_opus_padding ${test_opus_padding_sources})
 | 
				
			||||||
 | 
					  target_include_directories(test_opus_padding
 | 
				
			||||||
 | 
					                             PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
 | 
				
			||||||
 | 
					  target_link_libraries(test_opus_padding PRIVATE opus)
 | 
				
			||||||
 | 
					  add_test(test_opus_padding test_opus_padding)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if(NOT BUILD_SHARED_LIBS)
 | 
				
			||||||
 | 
					    # disable tests that depends on private API when building shared lib
 | 
				
			||||||
 | 
					    add_executable(test_opus_api ${test_opus_api_sources})
 | 
				
			||||||
 | 
					    target_include_directories(test_opus_api
 | 
				
			||||||
 | 
					                               PRIVATE ${CMAKE_CURRENT_BINARY_DIR} celt)
 | 
				
			||||||
 | 
					    target_link_libraries(test_opus_api PRIVATE opus)
 | 
				
			||||||
 | 
					    if(OPUS_FIXED_POINT)
 | 
				
			||||||
 | 
					      target_compile_definitions(test_opus_api PRIVATE DISABLE_FLOAT_API)
 | 
				
			||||||
 | 
					    endif()
 | 
				
			||||||
 | 
					    add_test(test_opus_api test_opus_api)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    add_executable(test_opus_encode ${test_opus_encode_sources})
 | 
				
			||||||
 | 
					    target_include_directories(test_opus_encode
 | 
				
			||||||
 | 
					                               PRIVATE ${CMAKE_CURRENT_BINARY_DIR} celt)
 | 
				
			||||||
 | 
					    target_link_libraries(test_opus_encode PRIVATE opus)
 | 
				
			||||||
 | 
					    add_test(test_opus_encode test_opus_encode)
 | 
				
			||||||
 | 
					  endif()
 | 
				
			||||||
 | 
					endif()
 | 
				
			||||||
							
								
								
									
										368
									
								
								node_modules/@discordjs/opus/deps/opus/INSTALL
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										368
									
								
								node_modules/@discordjs/opus/deps/opus/INSTALL
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,368 @@
 | 
				
			|||||||
 | 
					Installation Instructions
 | 
				
			||||||
 | 
					*************************
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Copyright (C) 1994-1996, 1999-2002, 2004-2016 Free Software
 | 
				
			||||||
 | 
					Foundation, Inc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Copying and distribution of this file, with or without modification,
 | 
				
			||||||
 | 
					are permitted in any medium without royalty provided the copyright
 | 
				
			||||||
 | 
					notice and this notice are preserved.  This file is offered as-is,
 | 
				
			||||||
 | 
					without warranty of any kind.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Basic Installation
 | 
				
			||||||
 | 
					==================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Briefly, the shell command './configure && make && make install'
 | 
				
			||||||
 | 
					should configure, build, and install this package.  The following
 | 
				
			||||||
 | 
					more-detailed instructions are generic; see the 'README' file for
 | 
				
			||||||
 | 
					instructions specific to this package.  Some packages provide this
 | 
				
			||||||
 | 
					'INSTALL' file but do not implement all of the features documented
 | 
				
			||||||
 | 
					below.  The lack of an optional feature in a given package is not
 | 
				
			||||||
 | 
					necessarily a bug.  More recommendations for GNU packages can be found
 | 
				
			||||||
 | 
					in *note Makefile Conventions: (standards)Makefile Conventions.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   The 'configure' shell script attempts to guess correct values for
 | 
				
			||||||
 | 
					various system-dependent variables used during compilation.  It uses
 | 
				
			||||||
 | 
					those values to create a 'Makefile' in each directory of the package.
 | 
				
			||||||
 | 
					It may also create one or more '.h' files containing system-dependent
 | 
				
			||||||
 | 
					definitions.  Finally, it creates a shell script 'config.status' that
 | 
				
			||||||
 | 
					you can run in the future to recreate the current configuration, and a
 | 
				
			||||||
 | 
					file 'config.log' containing compiler output (useful mainly for
 | 
				
			||||||
 | 
					debugging 'configure').
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   It can also use an optional file (typically called 'config.cache' and
 | 
				
			||||||
 | 
					enabled with '--cache-file=config.cache' or simply '-C') that saves the
 | 
				
			||||||
 | 
					results of its tests to speed up reconfiguring.  Caching is disabled by
 | 
				
			||||||
 | 
					default to prevent problems with accidental use of stale cache files.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   If you need to do unusual things to compile the package, please try
 | 
				
			||||||
 | 
					to figure out how 'configure' could check whether to do them, and mail
 | 
				
			||||||
 | 
					diffs or instructions to the address given in the 'README' so they can
 | 
				
			||||||
 | 
					be considered for the next release.  If you are using the cache, and at
 | 
				
			||||||
 | 
					some point 'config.cache' contains results you don't want to keep, you
 | 
				
			||||||
 | 
					may remove or edit it.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   The file 'configure.ac' (or 'configure.in') is used to create
 | 
				
			||||||
 | 
					'configure' by a program called 'autoconf'.  You need 'configure.ac' if
 | 
				
			||||||
 | 
					you want to change it or regenerate 'configure' using a newer version of
 | 
				
			||||||
 | 
					'autoconf'.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   The simplest way to compile this package is:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  1. 'cd' to the directory containing the package's source code and type
 | 
				
			||||||
 | 
					     './configure' to configure the package for your system.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     Running 'configure' might take a while.  While running, it prints
 | 
				
			||||||
 | 
					     some messages telling which features it is checking for.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  2. Type 'make' to compile the package.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  3. Optionally, type 'make check' to run any self-tests that come with
 | 
				
			||||||
 | 
					     the package, generally using the just-built uninstalled binaries.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  4. Type 'make install' to install the programs and any data files and
 | 
				
			||||||
 | 
					     documentation.  When installing into a prefix owned by root, it is
 | 
				
			||||||
 | 
					     recommended that the package be configured and built as a regular
 | 
				
			||||||
 | 
					     user, and only the 'make install' phase executed with root
 | 
				
			||||||
 | 
					     privileges.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  5. Optionally, type 'make installcheck' to repeat any self-tests, but
 | 
				
			||||||
 | 
					     this time using the binaries in their final installed location.
 | 
				
			||||||
 | 
					     This target does not install anything.  Running this target as a
 | 
				
			||||||
 | 
					     regular user, particularly if the prior 'make install' required
 | 
				
			||||||
 | 
					     root privileges, verifies that the installation completed
 | 
				
			||||||
 | 
					     correctly.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  6. You can remove the program binaries and object files from the
 | 
				
			||||||
 | 
					     source code directory by typing 'make clean'.  To also remove the
 | 
				
			||||||
 | 
					     files that 'configure' created (so you can compile the package for
 | 
				
			||||||
 | 
					     a different kind of computer), type 'make distclean'.  There is
 | 
				
			||||||
 | 
					     also a 'make maintainer-clean' target, but that is intended mainly
 | 
				
			||||||
 | 
					     for the package's developers.  If you use it, you may have to get
 | 
				
			||||||
 | 
					     all sorts of other programs in order to regenerate files that came
 | 
				
			||||||
 | 
					     with the distribution.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  7. Often, you can also type 'make uninstall' to remove the installed
 | 
				
			||||||
 | 
					     files again.  In practice, not all packages have tested that
 | 
				
			||||||
 | 
					     uninstallation works correctly, even though it is required by the
 | 
				
			||||||
 | 
					     GNU Coding Standards.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  8. Some packages, particularly those that use Automake, provide 'make
 | 
				
			||||||
 | 
					     distcheck', which can by used by developers to test that all other
 | 
				
			||||||
 | 
					     targets like 'make install' and 'make uninstall' work correctly.
 | 
				
			||||||
 | 
					     This target is generally not run by end users.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Compilers and Options
 | 
				
			||||||
 | 
					=====================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Some systems require unusual options for compilation or linking that
 | 
				
			||||||
 | 
					the 'configure' script does not know about.  Run './configure --help'
 | 
				
			||||||
 | 
					for details on some of the pertinent environment variables.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   You can give 'configure' initial values for configuration parameters
 | 
				
			||||||
 | 
					by setting variables in the command line or in the environment.  Here is
 | 
				
			||||||
 | 
					an example:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     ./configure CC=c99 CFLAGS=-g LIBS=-lposix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   *Note Defining Variables::, for more details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Compiling For Multiple Architectures
 | 
				
			||||||
 | 
					====================================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   You can compile the package for more than one kind of computer at the
 | 
				
			||||||
 | 
					same time, by placing the object files for each architecture in their
 | 
				
			||||||
 | 
					own directory.  To do this, you can use GNU 'make'.  'cd' to the
 | 
				
			||||||
 | 
					directory where you want the object files and executables to go and run
 | 
				
			||||||
 | 
					the 'configure' script.  'configure' automatically checks for the source
 | 
				
			||||||
 | 
					code in the directory that 'configure' is in and in '..'.  This is known
 | 
				
			||||||
 | 
					as a "VPATH" build.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   With a non-GNU 'make', it is safer to compile the package for one
 | 
				
			||||||
 | 
					architecture at a time in the source code directory.  After you have
 | 
				
			||||||
 | 
					installed the package for one architecture, use 'make distclean' before
 | 
				
			||||||
 | 
					reconfiguring for another architecture.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   On MacOS X 10.5 and later systems, you can create libraries and
 | 
				
			||||||
 | 
					executables that work on multiple system types--known as "fat" or
 | 
				
			||||||
 | 
					"universal" binaries--by specifying multiple '-arch' options to the
 | 
				
			||||||
 | 
					compiler but only a single '-arch' option to the preprocessor.  Like
 | 
				
			||||||
 | 
					this:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
 | 
				
			||||||
 | 
					                 CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
 | 
				
			||||||
 | 
					                 CPP="gcc -E" CXXCPP="g++ -E"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   This is not guaranteed to produce working output in all cases, you
 | 
				
			||||||
 | 
					may have to build one architecture at a time and combine the results
 | 
				
			||||||
 | 
					using the 'lipo' tool if you have problems.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Installation Names
 | 
				
			||||||
 | 
					==================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   By default, 'make install' installs the package's commands under
 | 
				
			||||||
 | 
					'/usr/local/bin', include files under '/usr/local/include', etc.  You
 | 
				
			||||||
 | 
					can specify an installation prefix other than '/usr/local' by giving
 | 
				
			||||||
 | 
					'configure' the option '--prefix=PREFIX', where PREFIX must be an
 | 
				
			||||||
 | 
					absolute file name.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   You can specify separate installation prefixes for
 | 
				
			||||||
 | 
					architecture-specific files and architecture-independent files.  If you
 | 
				
			||||||
 | 
					pass the option '--exec-prefix=PREFIX' to 'configure', the package uses
 | 
				
			||||||
 | 
					PREFIX as the prefix for installing programs and libraries.
 | 
				
			||||||
 | 
					Documentation and other data files still use the regular prefix.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   In addition, if you use an unusual directory layout you can give
 | 
				
			||||||
 | 
					options like '--bindir=DIR' to specify different values for particular
 | 
				
			||||||
 | 
					kinds of files.  Run 'configure --help' for a list of the directories
 | 
				
			||||||
 | 
					you can set and what kinds of files go in them.  In general, the default
 | 
				
			||||||
 | 
					for these options is expressed in terms of '${prefix}', so that
 | 
				
			||||||
 | 
					specifying just '--prefix' will affect all of the other directory
 | 
				
			||||||
 | 
					specifications that were not explicitly provided.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   The most portable way to affect installation locations is to pass the
 | 
				
			||||||
 | 
					correct locations to 'configure'; however, many packages provide one or
 | 
				
			||||||
 | 
					both of the following shortcuts of passing variable assignments to the
 | 
				
			||||||
 | 
					'make install' command line to change installation locations without
 | 
				
			||||||
 | 
					having to reconfigure or recompile.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   The first method involves providing an override variable for each
 | 
				
			||||||
 | 
					affected directory.  For example, 'make install
 | 
				
			||||||
 | 
					prefix=/alternate/directory' will choose an alternate location for all
 | 
				
			||||||
 | 
					directory configuration variables that were expressed in terms of
 | 
				
			||||||
 | 
					'${prefix}'.  Any directories that were specified during 'configure',
 | 
				
			||||||
 | 
					but not in terms of '${prefix}', must each be overridden at install time
 | 
				
			||||||
 | 
					for the entire installation to be relocated.  The approach of makefile
 | 
				
			||||||
 | 
					variable overrides for each directory variable is required by the GNU
 | 
				
			||||||
 | 
					Coding Standards, and ideally causes no recompilation.  However, some
 | 
				
			||||||
 | 
					platforms have known limitations with the semantics of shared libraries
 | 
				
			||||||
 | 
					that end up requiring recompilation when using this method, particularly
 | 
				
			||||||
 | 
					noticeable in packages that use GNU Libtool.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   The second method involves providing the 'DESTDIR' variable.  For
 | 
				
			||||||
 | 
					example, 'make install DESTDIR=/alternate/directory' will prepend
 | 
				
			||||||
 | 
					'/alternate/directory' before all installation names.  The approach of
 | 
				
			||||||
 | 
					'DESTDIR' overrides is not required by the GNU Coding Standards, and
 | 
				
			||||||
 | 
					does not work on platforms that have drive letters.  On the other hand,
 | 
				
			||||||
 | 
					it does better at avoiding recompilation issues, and works well even
 | 
				
			||||||
 | 
					when some directory options were not specified in terms of '${prefix}'
 | 
				
			||||||
 | 
					at 'configure' time.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Optional Features
 | 
				
			||||||
 | 
					=================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   If the package supports it, you can cause programs to be installed
 | 
				
			||||||
 | 
					with an extra prefix or suffix on their names by giving 'configure' the
 | 
				
			||||||
 | 
					option '--program-prefix=PREFIX' or '--program-suffix=SUFFIX'.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Some packages pay attention to '--enable-FEATURE' options to
 | 
				
			||||||
 | 
					'configure', where FEATURE indicates an optional part of the package.
 | 
				
			||||||
 | 
					They may also pay attention to '--with-PACKAGE' options, where PACKAGE
 | 
				
			||||||
 | 
					is something like 'gnu-as' or 'x' (for the X Window System).  The
 | 
				
			||||||
 | 
					'README' should mention any '--enable-' and '--with-' options that the
 | 
				
			||||||
 | 
					package recognizes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   For packages that use the X Window System, 'configure' can usually
 | 
				
			||||||
 | 
					find the X include and library files automatically, but if it doesn't,
 | 
				
			||||||
 | 
					you can use the 'configure' options '--x-includes=DIR' and
 | 
				
			||||||
 | 
					'--x-libraries=DIR' to specify their locations.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Some packages offer the ability to configure how verbose the
 | 
				
			||||||
 | 
					execution of 'make' will be.  For these packages, running './configure
 | 
				
			||||||
 | 
					--enable-silent-rules' sets the default to minimal output, which can be
 | 
				
			||||||
 | 
					overridden with 'make V=1'; while running './configure
 | 
				
			||||||
 | 
					--disable-silent-rules' sets the default to verbose, which can be
 | 
				
			||||||
 | 
					overridden with 'make V=0'.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Particular systems
 | 
				
			||||||
 | 
					==================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   On HP-UX, the default C compiler is not ANSI C compatible.  If GNU CC
 | 
				
			||||||
 | 
					is not installed, it is recommended to use the following options in
 | 
				
			||||||
 | 
					order to use an ANSI C compiler:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     ./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					and if that doesn't work, install pre-built binaries of GCC for HP-UX.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   HP-UX 'make' updates targets which have the same time stamps as their
 | 
				
			||||||
 | 
					prerequisites, which makes it generally unusable when shipped generated
 | 
				
			||||||
 | 
					files such as 'configure' are involved.  Use GNU 'make' instead.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
 | 
				
			||||||
 | 
					parse its '<wchar.h>' header file.  The option '-nodtk' can be used as a
 | 
				
			||||||
 | 
					workaround.  If GNU CC is not installed, it is therefore recommended to
 | 
				
			||||||
 | 
					try
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     ./configure CC="cc"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					and if that doesn't work, try
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     ./configure CC="cc -nodtk"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   On Solaris, don't put '/usr/ucb' early in your 'PATH'.  This
 | 
				
			||||||
 | 
					directory contains several dysfunctional programs; working variants of
 | 
				
			||||||
 | 
					these programs are available in '/usr/bin'.  So, if you need '/usr/ucb'
 | 
				
			||||||
 | 
					in your 'PATH', put it _after_ '/usr/bin'.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   On Haiku, software installed for all users goes in '/boot/common',
 | 
				
			||||||
 | 
					not '/usr/local'.  It is recommended to use the following options:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     ./configure --prefix=/boot/common
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Specifying the System Type
 | 
				
			||||||
 | 
					==========================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   There may be some features 'configure' cannot figure out
 | 
				
			||||||
 | 
					automatically, but needs to determine by the type of machine the package
 | 
				
			||||||
 | 
					will run on.  Usually, assuming the package is built to be run on the
 | 
				
			||||||
 | 
					_same_ architectures, 'configure' can figure that out, but if it prints
 | 
				
			||||||
 | 
					a message saying it cannot guess the machine type, give it the
 | 
				
			||||||
 | 
					'--build=TYPE' option.  TYPE can either be a short name for the system
 | 
				
			||||||
 | 
					type, such as 'sun4', or a canonical name which has the form:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     CPU-COMPANY-SYSTEM
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					where SYSTEM can have one of these forms:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     OS
 | 
				
			||||||
 | 
					     KERNEL-OS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   See the file 'config.sub' for the possible values of each field.  If
 | 
				
			||||||
 | 
					'config.sub' isn't included in this package, then this package doesn't
 | 
				
			||||||
 | 
					need to know the machine type.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   If you are _building_ compiler tools for cross-compiling, you should
 | 
				
			||||||
 | 
					use the option '--target=TYPE' to select the type of system they will
 | 
				
			||||||
 | 
					produce code for.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   If you want to _use_ a cross compiler, that generates code for a
 | 
				
			||||||
 | 
					platform different from the build platform, you should specify the
 | 
				
			||||||
 | 
					"host" platform (i.e., that on which the generated programs will
 | 
				
			||||||
 | 
					eventually be run) with '--host=TYPE'.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Sharing Defaults
 | 
				
			||||||
 | 
					================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   If you want to set default values for 'configure' scripts to share,
 | 
				
			||||||
 | 
					you can create a site shell script called 'config.site' that gives
 | 
				
			||||||
 | 
					default values for variables like 'CC', 'cache_file', and 'prefix'.
 | 
				
			||||||
 | 
					'configure' looks for 'PREFIX/share/config.site' if it exists, then
 | 
				
			||||||
 | 
					'PREFIX/etc/config.site' if it exists.  Or, you can set the
 | 
				
			||||||
 | 
					'CONFIG_SITE' environment variable to the location of the site script.
 | 
				
			||||||
 | 
					A warning: not all 'configure' scripts look for a site script.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Defining Variables
 | 
				
			||||||
 | 
					==================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   Variables not defined in a site shell script can be set in the
 | 
				
			||||||
 | 
					environment passed to 'configure'.  However, some packages may run
 | 
				
			||||||
 | 
					configure again during the build, and the customized values of these
 | 
				
			||||||
 | 
					variables may be lost.  In order to avoid this problem, you should set
 | 
				
			||||||
 | 
					them in the 'configure' command line, using 'VAR=value'.  For example:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     ./configure CC=/usr/local2/bin/gcc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					causes the specified 'gcc' to be used as the C compiler (unless it is
 | 
				
			||||||
 | 
					overridden in the site shell script).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unfortunately, this technique does not work for 'CONFIG_SHELL' due to an
 | 
				
			||||||
 | 
					Autoconf limitation.  Until the limitation is lifted, you can use this
 | 
				
			||||||
 | 
					workaround:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					     CONFIG_SHELL=/bin/bash ./configure CONFIG_SHELL=/bin/bash
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					'configure' Invocation
 | 
				
			||||||
 | 
					======================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   'configure' recognizes the following options to control how it
 | 
				
			||||||
 | 
					operates.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					'--help'
 | 
				
			||||||
 | 
					'-h'
 | 
				
			||||||
 | 
					     Print a summary of all of the options to 'configure', and exit.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					'--help=short'
 | 
				
			||||||
 | 
					'--help=recursive'
 | 
				
			||||||
 | 
					     Print a summary of the options unique to this package's
 | 
				
			||||||
 | 
					     'configure', and exit.  The 'short' variant lists options used only
 | 
				
			||||||
 | 
					     in the top level, while the 'recursive' variant lists options also
 | 
				
			||||||
 | 
					     present in any nested packages.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					'--version'
 | 
				
			||||||
 | 
					'-V'
 | 
				
			||||||
 | 
					     Print the version of Autoconf used to generate the 'configure'
 | 
				
			||||||
 | 
					     script, and exit.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					'--cache-file=FILE'
 | 
				
			||||||
 | 
					     Enable the cache: use and save the results of the tests in FILE,
 | 
				
			||||||
 | 
					     traditionally 'config.cache'.  FILE defaults to '/dev/null' to
 | 
				
			||||||
 | 
					     disable caching.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					'--config-cache'
 | 
				
			||||||
 | 
					'-C'
 | 
				
			||||||
 | 
					     Alias for '--cache-file=config.cache'.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					'--quiet'
 | 
				
			||||||
 | 
					'--silent'
 | 
				
			||||||
 | 
					'-q'
 | 
				
			||||||
 | 
					     Do not print messages saying which checks are being made.  To
 | 
				
			||||||
 | 
					     suppress all normal output, redirect it to '/dev/null' (any error
 | 
				
			||||||
 | 
					     messages will still be shown).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					'--srcdir=DIR'
 | 
				
			||||||
 | 
					     Look for the package's source code in directory DIR.  Usually
 | 
				
			||||||
 | 
					     'configure' can determine that directory automatically.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					'--prefix=DIR'
 | 
				
			||||||
 | 
					     Use DIR as the installation prefix.  *note Installation Names:: for
 | 
				
			||||||
 | 
					     more details, including other options available for fine-tuning the
 | 
				
			||||||
 | 
					     installation locations.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					'--no-create'
 | 
				
			||||||
 | 
					'-n'
 | 
				
			||||||
 | 
					     Run the configure checks, but stop before creating any output
 | 
				
			||||||
 | 
					     files.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					'configure' also accepts some other, not widely useful, options.  Run
 | 
				
			||||||
 | 
					'configure --help' for more details.
 | 
				
			||||||
@@ -21,6 +21,9 @@ SILK_SOURCES += $(SILK_SOURCES_FIXED)
 | 
				
			|||||||
if HAVE_SSE4_1
 | 
					if HAVE_SSE4_1
 | 
				
			||||||
SILK_SOURCES += $(SILK_SOURCES_SSE4_1) $(SILK_SOURCES_FIXED_SSE4_1)
 | 
					SILK_SOURCES += $(SILK_SOURCES_SSE4_1) $(SILK_SOURCES_FIXED_SSE4_1)
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					if HAVE_ARM_NEON_INTR
 | 
				
			||||||
 | 
					SILK_SOURCES += $(SILK_SOURCES_FIXED_ARM_NEON_INTR)
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
else
 | 
					else
 | 
				
			||||||
SILK_SOURCES += $(SILK_SOURCES_FLOAT)
 | 
					SILK_SOURCES += $(SILK_SOURCES_FLOAT)
 | 
				
			||||||
if HAVE_SSE4_1
 | 
					if HAVE_SSE4_1
 | 
				
			||||||
@@ -47,8 +50,9 @@ if CPU_ARM
 | 
				
			|||||||
CELT_SOURCES += $(CELT_SOURCES_ARM)
 | 
					CELT_SOURCES += $(CELT_SOURCES_ARM)
 | 
				
			||||||
SILK_SOURCES += $(SILK_SOURCES_ARM)
 | 
					SILK_SOURCES += $(SILK_SOURCES_ARM)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if OPUS_ARM_NEON_INTR
 | 
					if HAVE_ARM_NEON_INTR
 | 
				
			||||||
CELT_SOURCES += $(CELT_SOURCES_ARM_NEON_INTR)
 | 
					CELT_SOURCES += $(CELT_SOURCES_ARM_NEON_INTR)
 | 
				
			||||||
 | 
					SILK_SOURCES += $(SILK_SOURCES_ARM_NEON_INTR)
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if HAVE_ARM_NE10
 | 
					if HAVE_ARM_NE10
 | 
				
			||||||
@@ -78,14 +82,43 @@ if OPUS_ARM_EXTERNAL_ASM
 | 
				
			|||||||
libopus_la_LIBADD += libarmasm.la
 | 
					libopus_la_LIBADD += libarmasm.la
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pkginclude_HEADERS = include/opus.h include/opus_multistream.h include/opus_types.h include/opus_defines.h
 | 
					pkginclude_HEADERS = include/opus.h include/opus_multistream.h include/opus_types.h include/opus_defines.h include/opus_projection.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
noinst_HEADERS = $(OPUS_HEAD) $(SILK_HEAD) $(CELT_HEAD)
 | 
					noinst_HEADERS = $(OPUS_HEAD) $(SILK_HEAD) $(CELT_HEAD)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if EXTRA_PROGRAMS
 | 
					if EXTRA_PROGRAMS
 | 
				
			||||||
noinst_PROGRAMS = opus_demo repacketizer_demo opus_compare tests/test_opus_api tests/test_opus_encode tests/test_opus_decode tests/test_opus_padding celt/tests/test_unit_cwrs32 celt/tests/test_unit_dft celt/tests/test_unit_entropy celt/tests/test_unit_laplace celt/tests/test_unit_mathops celt/tests/test_unit_mdct celt/tests/test_unit_rotation celt/tests/test_unit_types
 | 
					noinst_PROGRAMS = celt/tests/test_unit_cwrs32 \
 | 
				
			||||||
 | 
					                  celt/tests/test_unit_dft \
 | 
				
			||||||
 | 
					                  celt/tests/test_unit_entropy \
 | 
				
			||||||
 | 
					                  celt/tests/test_unit_laplace \
 | 
				
			||||||
 | 
					                  celt/tests/test_unit_mathops \
 | 
				
			||||||
 | 
					                  celt/tests/test_unit_mdct \
 | 
				
			||||||
 | 
					                  celt/tests/test_unit_rotation \
 | 
				
			||||||
 | 
					                  celt/tests/test_unit_types \
 | 
				
			||||||
 | 
					                  opus_compare \
 | 
				
			||||||
 | 
					                  opus_demo \
 | 
				
			||||||
 | 
					                  repacketizer_demo \
 | 
				
			||||||
 | 
					                  silk/tests/test_unit_LPC_inv_pred_gain \
 | 
				
			||||||
 | 
					                  tests/test_opus_api \
 | 
				
			||||||
 | 
					                  tests/test_opus_decode \
 | 
				
			||||||
 | 
					                  tests/test_opus_encode \
 | 
				
			||||||
 | 
					                  tests/test_opus_padding \
 | 
				
			||||||
 | 
					                  tests/test_opus_projection
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TESTS = celt/tests/test_unit_types celt/tests/test_unit_mathops celt/tests/test_unit_entropy celt/tests/test_unit_laplace celt/tests/test_unit_dft celt/tests/test_unit_mdct celt/tests/test_unit_rotation celt/tests/test_unit_cwrs32 tests/test_opus_api tests/test_opus_decode tests/test_opus_encode tests/test_opus_padding
 | 
					TESTS = celt/tests/test_unit_cwrs32 \
 | 
				
			||||||
 | 
					        celt/tests/test_unit_dft \
 | 
				
			||||||
 | 
					        celt/tests/test_unit_entropy \
 | 
				
			||||||
 | 
					        celt/tests/test_unit_laplace \
 | 
				
			||||||
 | 
					        celt/tests/test_unit_mathops \
 | 
				
			||||||
 | 
					        celt/tests/test_unit_mdct \
 | 
				
			||||||
 | 
					        celt/tests/test_unit_rotation \
 | 
				
			||||||
 | 
					        celt/tests/test_unit_types \
 | 
				
			||||||
 | 
					        silk/tests/test_unit_LPC_inv_pred_gain \
 | 
				
			||||||
 | 
					        tests/test_opus_api \
 | 
				
			||||||
 | 
					        tests/test_opus_decode \
 | 
				
			||||||
 | 
					        tests/test_opus_encode \
 | 
				
			||||||
 | 
					        tests/test_opus_padding \
 | 
				
			||||||
 | 
					        tests/test_opus_projection
 | 
				
			||||||
 | 
					
 | 
				
			||||||
opus_demo_SOURCES = src/opus_demo.c
 | 
					opus_demo_SOURCES = src/opus_demo.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -101,7 +134,7 @@ opus_compare_LDADD = $(LIBM)
 | 
				
			|||||||
tests_test_opus_api_SOURCES = tests/test_opus_api.c tests/test_opus_common.h
 | 
					tests_test_opus_api_SOURCES = tests/test_opus_api.c tests/test_opus_common.h
 | 
				
			||||||
tests_test_opus_api_LDADD = libopus.la $(NE10_LIBS) $(LIBM)
 | 
					tests_test_opus_api_LDADD = libopus.la $(NE10_LIBS) $(LIBM)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
tests_test_opus_encode_SOURCES = tests/test_opus_encode.c tests/test_opus_common.h
 | 
					tests_test_opus_encode_SOURCES = tests/test_opus_encode.c tests/opus_encode_regressions.c tests/test_opus_common.h
 | 
				
			||||||
tests_test_opus_encode_LDADD = libopus.la $(NE10_LIBS) $(LIBM)
 | 
					tests_test_opus_encode_LDADD = libopus.la $(NE10_LIBS) $(LIBM)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
tests_test_opus_decode_SOURCES = tests/test_opus_decode.c tests/test_opus_common.h
 | 
					tests_test_opus_decode_SOURCES = tests/test_opus_decode.c tests/test_opus_common.h
 | 
				
			||||||
@@ -110,11 +143,27 @@ tests_test_opus_decode_LDADD = libopus.la $(NE10_LIBS) $(LIBM)
 | 
				
			|||||||
tests_test_opus_padding_SOURCES = tests/test_opus_padding.c tests/test_opus_common.h
 | 
					tests_test_opus_padding_SOURCES = tests/test_opus_padding.c tests/test_opus_common.h
 | 
				
			||||||
tests_test_opus_padding_LDADD = libopus.la $(NE10_LIBS) $(LIBM)
 | 
					tests_test_opus_padding_LDADD = libopus.la $(NE10_LIBS) $(LIBM)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					CELT_OBJ = $(CELT_SOURCES:.c=.lo)
 | 
				
			||||||
 | 
					SILK_OBJ = $(SILK_SOURCES:.c=.lo)
 | 
				
			||||||
 | 
					OPUS_OBJ = $(OPUS_SOURCES:.c=.lo)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					tests_test_opus_projection_SOURCES = tests/test_opus_projection.c tests/test_opus_common.h
 | 
				
			||||||
 | 
					tests_test_opus_projection_LDADD = $(OPUS_OBJ) $(SILK_OBJ) $(CELT_OBJ) $(NE10_LIBS) $(LIBM)
 | 
				
			||||||
 | 
					if OPUS_ARM_EXTERNAL_ASM
 | 
				
			||||||
 | 
					tests_test_opus_projection_LDADD += libarmasm.la
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					silk_tests_test_unit_LPC_inv_pred_gain_SOURCES = silk/tests/test_unit_LPC_inv_pred_gain.c
 | 
				
			||||||
 | 
					silk_tests_test_unit_LPC_inv_pred_gain_LDADD = $(SILK_OBJ) $(CELT_OBJ) $(NE10_LIBS) $(LIBM)
 | 
				
			||||||
 | 
					if OPUS_ARM_EXTERNAL_ASM
 | 
				
			||||||
 | 
					silk_tests_test_unit_LPC_inv_pred_gain_LDADD += libarmasm.la
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
celt_tests_test_unit_cwrs32_SOURCES = celt/tests/test_unit_cwrs32.c
 | 
					celt_tests_test_unit_cwrs32_SOURCES = celt/tests/test_unit_cwrs32.c
 | 
				
			||||||
celt_tests_test_unit_cwrs32_LDADD = $(LIBM)
 | 
					celt_tests_test_unit_cwrs32_LDADD = $(LIBM)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
celt_tests_test_unit_dft_SOURCES = celt/tests/test_unit_dft.c
 | 
					celt_tests_test_unit_dft_SOURCES = celt/tests/test_unit_dft.c
 | 
				
			||||||
celt_tests_test_unit_dft_LDADD = $(NE10_LIBS) $(LIBM)
 | 
					celt_tests_test_unit_dft_LDADD = $(CELT_OBJ) $(NE10_LIBS) $(LIBM)
 | 
				
			||||||
if OPUS_ARM_EXTERNAL_ASM
 | 
					if OPUS_ARM_EXTERNAL_ASM
 | 
				
			||||||
celt_tests_test_unit_dft_LDADD += libarmasm.la
 | 
					celt_tests_test_unit_dft_LDADD += libarmasm.la
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
@@ -126,19 +175,19 @@ celt_tests_test_unit_laplace_SOURCES = celt/tests/test_unit_laplace.c
 | 
				
			|||||||
celt_tests_test_unit_laplace_LDADD = $(LIBM)
 | 
					celt_tests_test_unit_laplace_LDADD = $(LIBM)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
celt_tests_test_unit_mathops_SOURCES = celt/tests/test_unit_mathops.c
 | 
					celt_tests_test_unit_mathops_SOURCES = celt/tests/test_unit_mathops.c
 | 
				
			||||||
celt_tests_test_unit_mathops_LDADD = $(NE10_LIBS) $(LIBM)
 | 
					celt_tests_test_unit_mathops_LDADD = $(CELT_OBJ) $(NE10_LIBS) $(LIBM)
 | 
				
			||||||
if OPUS_ARM_EXTERNAL_ASM
 | 
					if OPUS_ARM_EXTERNAL_ASM
 | 
				
			||||||
celt_tests_test_unit_mathops_LDADD += libarmasm.la
 | 
					celt_tests_test_unit_mathops_LDADD += libarmasm.la
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
celt_tests_test_unit_mdct_SOURCES = celt/tests/test_unit_mdct.c
 | 
					celt_tests_test_unit_mdct_SOURCES = celt/tests/test_unit_mdct.c
 | 
				
			||||||
celt_tests_test_unit_mdct_LDADD = $(NE10_LIBS) $(LIBM)
 | 
					celt_tests_test_unit_mdct_LDADD = $(CELT_OBJ) $(NE10_LIBS) $(LIBM)
 | 
				
			||||||
if OPUS_ARM_EXTERNAL_ASM
 | 
					if OPUS_ARM_EXTERNAL_ASM
 | 
				
			||||||
celt_tests_test_unit_mdct_LDADD += libarmasm.la
 | 
					celt_tests_test_unit_mdct_LDADD += libarmasm.la
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
celt_tests_test_unit_rotation_SOURCES = celt/tests/test_unit_rotation.c
 | 
					celt_tests_test_unit_rotation_SOURCES = celt/tests/test_unit_rotation.c
 | 
				
			||||||
celt_tests_test_unit_rotation_LDADD = $(NE10_LIBS) $(LIBM)
 | 
					celt_tests_test_unit_rotation_LDADD = $(CELT_OBJ) $(NE10_LIBS) $(LIBM)
 | 
				
			||||||
if OPUS_ARM_EXTERNAL_ASM
 | 
					if OPUS_ARM_EXTERNAL_ASM
 | 
				
			||||||
celt_tests_test_unit_rotation_LDADD += libarmasm.la
 | 
					celt_tests_test_unit_rotation_LDADD += libarmasm.la
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
@@ -156,34 +205,32 @@ opus_custom_demo_LDADD = libopus.la $(LIBM)
 | 
				
			|||||||
endif
 | 
					endif
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
EXTRA_DIST = version.mk \
 | 
					EXTRA_DIST = opus.pc.in \
 | 
				
			||||||
             opus.pc.in \
 | 
					 | 
				
			||||||
             opus-uninstalled.pc.in \
 | 
					             opus-uninstalled.pc.in \
 | 
				
			||||||
             opus.m4 \
 | 
					             opus.m4 \
 | 
				
			||||||
             Makefile.mips \
 | 
					             Makefile.mips \
 | 
				
			||||||
             Makefile.unix \
 | 
					             Makefile.unix \
 | 
				
			||||||
 | 
					             CMakeLists.txt \
 | 
				
			||||||
 | 
					             config.h.cmake.in \
 | 
				
			||||||
 | 
					             opus_config.cmake \
 | 
				
			||||||
 | 
					             opus_functions.cmake \
 | 
				
			||||||
 | 
					             opus_sources.cmake \
 | 
				
			||||||
 | 
					             OpusConfig.cmake.in \
 | 
				
			||||||
             tests/run_vectors.sh \
 | 
					             tests/run_vectors.sh \
 | 
				
			||||||
             celt/arm/arm2gnu.pl \
 | 
					             celt/arm/arm2gnu.pl \
 | 
				
			||||||
             celt/arm/celt_pitch_xcorr_arm.s \
 | 
					             celt/arm/celt_pitch_xcorr_arm.s \
 | 
				
			||||||
             win32/VS2010/silk_float.vcxproj \
 | 
					             win32/VS2015/opus.vcxproj \
 | 
				
			||||||
             win32/VS2010/celt.vcxproj.filters \
 | 
					             win32/VS2015/test_opus_encode.vcxproj.filters \
 | 
				
			||||||
             win32/VS2010/opus.vcxproj \
 | 
					             win32/VS2015/test_opus_encode.vcxproj \
 | 
				
			||||||
             win32/VS2010/silk_common.vcxproj.filters \
 | 
					             win32/VS2015/opus_demo.vcxproj \
 | 
				
			||||||
             win32/VS2010/silk_float.vcxproj.filters \
 | 
					             win32/VS2015/test_opus_api.vcxproj.filters \
 | 
				
			||||||
             win32/VS2010/test_opus_encode.vcxproj.filters \
 | 
					             win32/VS2015/test_opus_api.vcxproj \
 | 
				
			||||||
             win32/VS2010/silk_common.vcxproj \
 | 
					             win32/VS2015/test_opus_decode.vcxproj.filters \
 | 
				
			||||||
             win32/VS2010/test_opus_encode.vcxproj \
 | 
					             win32/VS2015/opus_demo.vcxproj.filters \
 | 
				
			||||||
             win32/VS2010/opus_demo.vcxproj \
 | 
					             win32/VS2015/opus.vcxproj.filters \
 | 
				
			||||||
             win32/VS2010/test_opus_api.vcxproj.filters \
 | 
					             win32/VS2015/test_opus_decode.vcxproj \
 | 
				
			||||||
             win32/VS2010/test_opus_api.vcxproj \
 | 
					             win32/VS2015/opus.sln \
 | 
				
			||||||
             win32/VS2010/test_opus_decode.vcxproj.filters \
 | 
					             win32/VS2015/common.props \
 | 
				
			||||||
             win32/VS2010/silk_fixed.vcxproj.filters \
 | 
					 | 
				
			||||||
             win32/VS2010/opus_demo.vcxproj.filters \
 | 
					 | 
				
			||||||
             win32/VS2010/silk_fixed.vcxproj \
 | 
					 | 
				
			||||||
             win32/VS2010/opus.vcxproj.filters \
 | 
					 | 
				
			||||||
             win32/VS2010/test_opus_decode.vcxproj \
 | 
					 | 
				
			||||||
             win32/VS2010/celt.vcxproj \
 | 
					 | 
				
			||||||
             win32/VS2010/opus.sln \
 | 
					 | 
				
			||||||
             win32/genversion.bat \
 | 
					             win32/genversion.bat \
 | 
				
			||||||
             win32/config.h
 | 
					             win32/config.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -275,27 +322,30 @@ $(CELT_SOURCES_ARM_ASM:%.s=%-gnu.S): $(top_srcdir)/celt/arm/arm2gnu.pl
 | 
				
			|||||||
OPT_UNIT_TEST_OBJ = $(celt_tests_test_unit_mathops_SOURCES:.c=.o) \
 | 
					OPT_UNIT_TEST_OBJ = $(celt_tests_test_unit_mathops_SOURCES:.c=.o) \
 | 
				
			||||||
                    $(celt_tests_test_unit_rotation_SOURCES:.c=.o) \
 | 
					                    $(celt_tests_test_unit_rotation_SOURCES:.c=.o) \
 | 
				
			||||||
                    $(celt_tests_test_unit_mdct_SOURCES:.c=.o) \
 | 
					                    $(celt_tests_test_unit_mdct_SOURCES:.c=.o) \
 | 
				
			||||||
                    $(celt_tests_test_unit_dft_SOURCES:.c=.o)
 | 
					                    $(celt_tests_test_unit_dft_SOURCES:.c=.o) \
 | 
				
			||||||
 | 
					                    $(silk_tests_test_unit_LPC_inv_pred_gain_SOURCES:.c=.o)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if HAVE_SSE
 | 
					if HAVE_SSE
 | 
				
			||||||
SSE_OBJ = $(CELT_SOURCES_SSE:.c=.lo)
 | 
					SSE_OBJ = $(CELT_SOURCES_SSE:.c=.lo)
 | 
				
			||||||
$(SSE_OBJ) $(OPT_UNIT_TEST_OBJ): CFLAGS += $(OPUS_X86_SSE_CFLAGS)
 | 
					$(SSE_OBJ): CFLAGS += $(OPUS_X86_SSE_CFLAGS)
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if HAVE_SSE2
 | 
					if HAVE_SSE2
 | 
				
			||||||
SSE2_OBJ = $(CELT_SOURCES_SSE2:.c=.lo)
 | 
					SSE2_OBJ = $(CELT_SOURCES_SSE2:.c=.lo)
 | 
				
			||||||
$(SSE2_OBJ) $(OPT_UNIT_TEST_OBJ): CFLAGS += $(OPUS_X86_SSE2_CFLAGS)
 | 
					$(SSE2_OBJ): CFLAGS += $(OPUS_X86_SSE2_CFLAGS)
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if HAVE_SSE4_1
 | 
					if HAVE_SSE4_1
 | 
				
			||||||
SSE4_1_OBJ = $(CELT_SOURCES_SSE4_1:.c=.lo) \
 | 
					SSE4_1_OBJ = $(CELT_SOURCES_SSE4_1:.c=.lo) \
 | 
				
			||||||
             $(SILK_SOURCES_SSE4_1:.c=.lo) \
 | 
					             $(SILK_SOURCES_SSE4_1:.c=.lo) \
 | 
				
			||||||
             $(SILK_SOURCES_FIXED_SSE4_1:.c=.lo)
 | 
					             $(SILK_SOURCES_FIXED_SSE4_1:.c=.lo)
 | 
				
			||||||
$(SSE4_1_OBJ) $(OPT_UNIT_TEST_OBJ): CFLAGS += $(OPUS_X86_SSE4_1_CFLAGS)
 | 
					$(SSE4_1_OBJ): CFLAGS += $(OPUS_X86_SSE4_1_CFLAGS)
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if OPUS_ARM_NEON_INTR
 | 
					if HAVE_ARM_NEON_INTR
 | 
				
			||||||
CELT_ARM_NEON_INTR_OBJ = $(CELT_SOURCES_ARM_NEON_INTR:.c=.lo)
 | 
					ARM_NEON_INTR_OBJ = $(CELT_SOURCES_ARM_NEON_INTR:.c=.lo) \
 | 
				
			||||||
$(CELT_ARM_NEON_INTR_OBJ) $(OPT_UNIT_TEST_OBJ): CFLAGS += \
 | 
					                    $(SILK_SOURCES_ARM_NEON_INTR:.c=.lo) \
 | 
				
			||||||
 | 
					                    $(SILK_SOURCES_FIXED_ARM_NEON_INTR:.c=.lo)
 | 
				
			||||||
 | 
					$(ARM_NEON_INTR_OBJ): CFLAGS += \
 | 
				
			||||||
 $(OPUS_ARM_NEON_INTR_CFLAGS)  $(NE10_CFLAGS)
 | 
					 $(OPUS_ARM_NEON_INTR_CFLAGS)  $(NE10_CFLAGS)
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -12,7 +12,7 @@ CFLAGS := -DUSE_ALLOCA $(CFLAGS)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# These options affect performance
 | 
					# These options affect performance
 | 
				
			||||||
# HAVE_LRINTF: Use C99 intrinsics to speed up float-to-int conversion
 | 
					# HAVE_LRINTF: Use C99 intrinsics to speed up float-to-int conversion
 | 
				
			||||||
#CFLAGS := -DHAVE_LRINTF $(CFLAGS)
 | 
					CFLAGS := -DHAVE_LRINTF $(CFLAGS)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
###################### END OF OPTIONS ######################
 | 
					###################### END OF OPTIONS ######################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -99,7 +99,7 @@ TESTOPUSAPI_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(TESTOPUSAPI_SRCS_C))
 | 
				
			|||||||
TESTOPUSDECODE_SRCS_C = tests/test_opus_decode.c
 | 
					TESTOPUSDECODE_SRCS_C = tests/test_opus_decode.c
 | 
				
			||||||
TESTOPUSDECODE_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(TESTOPUSDECODE_SRCS_C))
 | 
					TESTOPUSDECODE_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(TESTOPUSDECODE_SRCS_C))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TESTOPUSENCODE_SRCS_C = tests/test_opus_encode.c
 | 
					TESTOPUSENCODE_SRCS_C = tests/test_opus_encode.c tests/opus_encode_regressions.c
 | 
				
			||||||
TESTOPUSENCODE_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(TESTOPUSENCODE_SRCS_C))
 | 
					TESTOPUSENCODE_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(TESTOPUSENCODE_SRCS_C))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TESTOPUSPADDING_SRCS_C = tests/test_opus_padding.c
 | 
					TESTOPUSPADDING_SRCS_C = tests/test_opus_padding.c
 | 
				
			||||||
@@ -97,7 +97,7 @@ TESTOPUSAPI_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(TESTOPUSAPI_SRCS_C))
 | 
				
			|||||||
TESTOPUSDECODE_SRCS_C = tests/test_opus_decode.c
 | 
					TESTOPUSDECODE_SRCS_C = tests/test_opus_decode.c
 | 
				
			||||||
TESTOPUSDECODE_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(TESTOPUSDECODE_SRCS_C))
 | 
					TESTOPUSDECODE_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(TESTOPUSDECODE_SRCS_C))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TESTOPUSENCODE_SRCS_C = tests/test_opus_encode.c
 | 
					TESTOPUSENCODE_SRCS_C = tests/test_opus_encode.c tests/opus_encode_regressions.c
 | 
				
			||||||
TESTOPUSENCODE_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(TESTOPUSENCODE_SRCS_C))
 | 
					TESTOPUSENCODE_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(TESTOPUSENCODE_SRCS_C))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TESTOPUSPADDING_SRCS_C = tests/test_opus_padding.c
 | 
					TESTOPUSPADDING_SRCS_C = tests/test_opus_padding.c
 | 
				
			||||||
							
								
								
									
										0
									
								
								node_modules/node-opus/deps/opus/NEWS → node_modules/@discordjs/opus/deps/opus/NEWS
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										0
									
								
								node_modules/node-opus/deps/opus/NEWS → node_modules/@discordjs/opus/deps/opus/NEWS
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
								
								
									
										19
									
								
								node_modules/@discordjs/opus/deps/opus/OpusConfig.cmake.in
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								node_modules/@discordjs/opus/deps/opus/OpusConfig.cmake.in
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					set(OPUS_VERSION @PROJECT_VERSION@)
 | 
				
			||||||
 | 
					set(OPUS_VERSION_STRING @PROJECT_VERSION@)
 | 
				
			||||||
 | 
					set(OPUS_VERSION_MAJOR @PROJECT_VERSION_MAJOR@)
 | 
				
			||||||
 | 
					set(OPUS_VERSION_MINOR @PROJECT_VERSION_MINOR@)
 | 
				
			||||||
 | 
					set(OPUS_VERSION_PATCH @PROJECT_VERSION_PATCH@)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@PACKAGE_INIT@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set_and_check(OPUS_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@")
 | 
				
			||||||
 | 
					set_and_check(OPUS_INCLUDE_DIRS "@PACKAGE_INCLUDE_INSTALL_DIR@")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					include(${CMAKE_CURRENT_LIST_DIR}/OpusTargets.cmake)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set(OPUS_LIBRARY Opus::opus)
 | 
				
			||||||
 | 
					set(OPUS_LIBRARIES Opus::opus)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					check_required_components(Opus)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set(OPUS_FOUND 1)
 | 
				
			||||||
							
								
								
									
										47
									
								
								node_modules/node-opus/deps/opus/README → node_modules/@discordjs/opus/deps/opus/README
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										47
									
								
								node_modules/node-opus/deps/opus/README → node_modules/@discordjs/opus/deps/opus/README
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -29,7 +29,7 @@ additional debugging data and cannot support seeking.
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
Opus stored in files should use the Ogg encapsulation for Opus which is
 | 
					Opus stored in files should use the Ogg encapsulation for Opus which is
 | 
				
			||||||
described at:
 | 
					described at:
 | 
				
			||||||
 https://wiki.xiph.org/OggOpus
 | 
					 https://tools.ietf.org/html/rfc7845
 | 
				
			||||||
 | 
					
 | 
				
			||||||
An opus-tools package is available which provides encoding and decoding of
 | 
					An opus-tools package is available which provides encoding and decoding of
 | 
				
			||||||
Ogg encapsulated Opus files and includes a number of useful features.
 | 
					Ogg encapsulated Opus files and includes a number of useful features.
 | 
				
			||||||
@@ -43,25 +43,43 @@ or on the main Opus website:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
To build from a distribution tarball, you only need to do the following:
 | 
					To build from a distribution tarball, you only need to do the following:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
% ./configure
 | 
					    % ./configure
 | 
				
			||||||
% make
 | 
					    % make
 | 
				
			||||||
 | 
					
 | 
				
			||||||
To build from the git repository, the following steps are necessary:
 | 
					To build from the git repository, the following steps are necessary:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					0) Set up a development environment:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					On an Ubuntu or Debian family Linux distribution:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % sudo apt-get install git autoconf automake libtool gcc make
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					On a Fedora/Redhat based Linux:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % sudo dnf install git autoconf automake libtool gcc make
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Or for older Redhat/Centos Linux releases:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % sudo yum install git autoconf automake libtool gcc make
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					On Apple macOS, install Xcode and brew.sh, then in the Terminal enter:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    % brew install autoconf automake libtool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
1) Clone the repository:
 | 
					1) Clone the repository:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
% git clone https://git.xiph.org/opus.git
 | 
					    % git clone https://git.xiph.org/opus.git
 | 
				
			||||||
% cd opus
 | 
					    % cd opus
 | 
				
			||||||
 | 
					
 | 
				
			||||||
2) Compiling the source
 | 
					2) Compiling the source
 | 
				
			||||||
 | 
					
 | 
				
			||||||
% ./autogen.sh
 | 
					    % ./autogen.sh
 | 
				
			||||||
% ./configure
 | 
					    % ./configure
 | 
				
			||||||
% make
 | 
					    % make
 | 
				
			||||||
 | 
					
 | 
				
			||||||
3) Install the codec libraries (optional)
 | 
					3) Install the codec libraries (optional)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
% sudo make install
 | 
					    % sudo make install
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Once you have compiled the codec, there will be a opus_demo executable
 | 
					Once you have compiled the codec, there will be a opus_demo executable
 | 
				
			||||||
in the top directory.
 | 
					in the top directory.
 | 
				
			||||||
@@ -102,17 +120,18 @@ which SHOULD be run after compiling the package especially the first
 | 
				
			|||||||
time it is run on a new platform.
 | 
					time it is run on a new platform.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
To run the integrated tests:
 | 
					To run the integrated tests:
 | 
				
			||||||
% make check
 | 
					
 | 
				
			||||||
 | 
					    % make check
 | 
				
			||||||
 | 
					
 | 
				
			||||||
There is also collection of standard test vectors which are not
 | 
					There is also collection of standard test vectors which are not
 | 
				
			||||||
included in this package for size reasons but can be obtained from:
 | 
					included in this package for size reasons but can be obtained from:
 | 
				
			||||||
https://opus-codec.org/testvectors/opus_testvectors.tar.gz
 | 
					https://opus-codec.org/docs/opus_testvectors-rfc8251.tar.gz
 | 
				
			||||||
 | 
					
 | 
				
			||||||
To run compare the code to these test vectors:
 | 
					To run compare the code to these test vectors:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
% curl -O https://opus-codec.org/testvectors/opus_testvectors.tar.gz
 | 
					    % curl -OL https://opus-codec.org/docs/opus_testvectors-rfc8251.tar.gz
 | 
				
			||||||
% tar -zxf opus_testvectors.tar.gz
 | 
					    % tar -zxf opus_testvectors-rfc8251.tar.gz
 | 
				
			||||||
% ./tests/run_vectors.sh ./ opus_testvectors 48000
 | 
					    % ./tests/run_vectors.sh ./ opus_newvectors 48000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
== Portability notes ==
 | 
					== Portability notes ==
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
# generated automatically by aclocal 1.15 -*- Autoconf -*-
 | 
					# generated automatically by aclocal 1.15.1 -*- Autoconf -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 | 
					# Copyright (C) 1996-2017 Free Software Foundation, Inc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# This file is free software; the Free Software Foundation
 | 
					# This file is free software; the Free Software Foundation
 | 
				
			||||||
# gives unlimited permission to copy and/or distribute it,
 | 
					# gives unlimited permission to copy and/or distribute it,
 | 
				
			||||||
@@ -20,7 +20,7 @@ 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.
 | 
					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'.])])
 | 
					To do so, use the procedure documented by the package, typically 'autoreconf'.])])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Copyright (C) 2002-2014 Free Software Foundation, Inc.
 | 
					# Copyright (C) 2002-2017 Free Software Foundation, Inc.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# This file is free software; the Free Software Foundation
 | 
					# This file is free software; the Free Software Foundation
 | 
				
			||||||
# gives unlimited permission to copy and/or distribute it,
 | 
					# gives unlimited permission to copy and/or distribute it,
 | 
				
			||||||
@@ -35,7 +35,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION],
 | 
				
			|||||||
[am__api_version='1.15'
 | 
					[am__api_version='1.15'
 | 
				
			||||||
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
 | 
					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.
 | 
					dnl require some minimum version.  Point them to the right macro.
 | 
				
			||||||
m4_if([$1], [1.15], [],
 | 
					m4_if([$1], [1.15.1], [],
 | 
				
			||||||
      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 | 
					      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
 | 
				
			||||||
])
 | 
					])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -51,14 +51,14 @@ m4_define([_AM_AUTOCONF_VERSION], [])
 | 
				
			|||||||
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 | 
					# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
 | 
				
			||||||
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 | 
					# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
 | 
				
			||||||
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
 | 
					AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
 | 
				
			||||||
[AM_AUTOMAKE_VERSION([1.15])dnl
 | 
					[AM_AUTOMAKE_VERSION([1.15.1])dnl
 | 
				
			||||||
m4_ifndef([AC_AUTOCONF_VERSION],
 | 
					m4_ifndef([AC_AUTOCONF_VERSION],
 | 
				
			||||||
  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 | 
					  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
 | 
				
			||||||
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 | 
					_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Figure out how to run the assembler.                      -*- Autoconf -*-
 | 
					# Figure out how to run the assembler.                      -*- Autoconf -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 | 
					# Copyright (C) 2001-2017 Free Software Foundation, Inc.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# This file is free software; the Free Software Foundation
 | 
					# This file is free software; the Free Software Foundation
 | 
				
			||||||
# gives unlimited permission to copy and/or distribute it,
 | 
					# gives unlimited permission to copy and/or distribute it,
 | 
				
			||||||
@@ -78,7 +78,7 @@ _AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 | 
					# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 | 
					# Copyright (C) 2001-2017 Free Software Foundation, Inc.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# This file is free software; the Free Software Foundation
 | 
					# This file is free software; the Free Software Foundation
 | 
				
			||||||
# gives unlimited permission to copy and/or distribute it,
 | 
					# gives unlimited permission to copy and/or distribute it,
 | 
				
			||||||
@@ -130,7 +130,7 @@ am_aux_dir=`cd "$ac_aux_dir" && pwd`
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# AM_CONDITIONAL                                            -*- Autoconf -*-
 | 
					# AM_CONDITIONAL                                            -*- Autoconf -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Copyright (C) 1997-2014 Free Software Foundation, Inc.
 | 
					# Copyright (C) 1997-2017 Free Software Foundation, Inc.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# This file is free software; the Free Software Foundation
 | 
					# This file is free software; the Free Software Foundation
 | 
				
			||||||
# gives unlimited permission to copy and/or distribute it,
 | 
					# gives unlimited permission to copy and/or distribute it,
 | 
				
			||||||
@@ -161,7 +161,7 @@ AC_CONFIG_COMMANDS_PRE(
 | 
				
			|||||||
Usually this means the macro was only invoked conditionally.]])
 | 
					Usually this means the macro was only invoked conditionally.]])
 | 
				
			||||||
fi])])
 | 
					fi])])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 | 
					# Copyright (C) 1999-2017 Free Software Foundation, Inc.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# This file is free software; the Free Software Foundation
 | 
					# This file is free software; the Free Software Foundation
 | 
				
			||||||
# gives unlimited permission to copy and/or distribute it,
 | 
					# gives unlimited permission to copy and/or distribute it,
 | 
				
			||||||
@@ -352,7 +352,7 @@ _AM_SUBST_NOTMAKE([am__nodep])dnl
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Generate code to set up dependency tracking.              -*- Autoconf -*-
 | 
					# Generate code to set up dependency tracking.              -*- Autoconf -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 | 
					# Copyright (C) 1999-2017 Free Software Foundation, Inc.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# This file is free software; the Free Software Foundation
 | 
					# This file is free software; the Free Software Foundation
 | 
				
			||||||
# gives unlimited permission to copy and/or distribute it,
 | 
					# gives unlimited permission to copy and/or distribute it,
 | 
				
			||||||
@@ -428,7 +428,7 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Do all the work for Automake.                             -*- Autoconf -*-
 | 
					# Do all the work for Automake.                             -*- Autoconf -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 | 
					# Copyright (C) 1996-2017 Free Software Foundation, Inc.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# This file is free software; the Free Software Foundation
 | 
					# This file is free software; the Free Software Foundation
 | 
				
			||||||
# gives unlimited permission to copy and/or distribute it,
 | 
					# gives unlimited permission to copy and/or distribute it,
 | 
				
			||||||
@@ -625,7 +625,7 @@ for _am_header in $config_headers :; do
 | 
				
			|||||||
done
 | 
					done
 | 
				
			||||||
echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 | 
					echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 | 
					# Copyright (C) 2001-2017 Free Software Foundation, Inc.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# This file is free software; the Free Software Foundation
 | 
					# This file is free software; the Free Software Foundation
 | 
				
			||||||
# gives unlimited permission to copy and/or distribute it,
 | 
					# gives unlimited permission to copy and/or distribute it,
 | 
				
			||||||
@@ -646,7 +646,7 @@ if test x"${install_sh+set}" != xset; then
 | 
				
			|||||||
fi
 | 
					fi
 | 
				
			||||||
AC_SUBST([install_sh])])
 | 
					AC_SUBST([install_sh])])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Copyright (C) 2003-2014 Free Software Foundation, Inc.
 | 
					# Copyright (C) 2003-2017 Free Software Foundation, Inc.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# This file is free software; the Free Software Foundation
 | 
					# This file is free software; the Free Software Foundation
 | 
				
			||||||
# gives unlimited permission to copy and/or distribute it,
 | 
					# gives unlimited permission to copy and/or distribute it,
 | 
				
			||||||
@@ -668,7 +668,7 @@ AC_SUBST([am__leading_dot])])
 | 
				
			|||||||
# Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
 | 
					# Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-
 | 
				
			||||||
# From Jim Meyering
 | 
					# From Jim Meyering
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 | 
					# Copyright (C) 1996-2017 Free Software Foundation, Inc.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# This file is free software; the Free Software Foundation
 | 
					# This file is free software; the Free Software Foundation
 | 
				
			||||||
# gives unlimited permission to copy and/or distribute it,
 | 
					# gives unlimited permission to copy and/or distribute it,
 | 
				
			||||||
@@ -703,7 +703,7 @@ AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Check to see how 'make' treats includes.	            -*- Autoconf -*-
 | 
					# Check to see how 'make' treats includes.	            -*- Autoconf -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 | 
					# Copyright (C) 2001-2017 Free Software Foundation, Inc.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# This file is free software; the Free Software Foundation
 | 
					# This file is free software; the Free Software Foundation
 | 
				
			||||||
# gives unlimited permission to copy and/or distribute it,
 | 
					# gives unlimited permission to copy and/or distribute it,
 | 
				
			||||||
@@ -753,7 +753,7 @@ rm -f confinc confmf
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 | 
					# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Copyright (C) 1997-2014 Free Software Foundation, Inc.
 | 
					# Copyright (C) 1997-2017 Free Software Foundation, Inc.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# This file is free software; the Free Software Foundation
 | 
					# This file is free software; the Free Software Foundation
 | 
				
			||||||
# gives unlimited permission to copy and/or distribute it,
 | 
					# gives unlimited permission to copy and/or distribute it,
 | 
				
			||||||
@@ -792,7 +792,7 @@ fi
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Helper functions for option handling.                     -*- Autoconf -*-
 | 
					# Helper functions for option handling.                     -*- Autoconf -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 | 
					# Copyright (C) 2001-2017 Free Software Foundation, Inc.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# This file is free software; the Free Software Foundation
 | 
					# This file is free software; the Free Software Foundation
 | 
				
			||||||
# gives unlimited permission to copy and/or distribute it,
 | 
					# gives unlimited permission to copy and/or distribute it,
 | 
				
			||||||
@@ -821,7 +821,7 @@ AC_DEFUN([_AM_SET_OPTIONS],
 | 
				
			|||||||
AC_DEFUN([_AM_IF_OPTION],
 | 
					AC_DEFUN([_AM_IF_OPTION],
 | 
				
			||||||
[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
 | 
					[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Copyright (C) 1999-2014 Free Software Foundation, Inc.
 | 
					# Copyright (C) 1999-2017 Free Software Foundation, Inc.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# This file is free software; the Free Software Foundation
 | 
					# This file is free software; the Free Software Foundation
 | 
				
			||||||
# gives unlimited permission to copy and/or distribute it,
 | 
					# gives unlimited permission to copy and/or distribute it,
 | 
				
			||||||
@@ -868,7 +868,7 @@ AC_LANG_POP([C])])
 | 
				
			|||||||
# For backward compatibility.
 | 
					# For backward compatibility.
 | 
				
			||||||
AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
 | 
					AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 | 
					# Copyright (C) 2001-2017 Free Software Foundation, Inc.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# This file is free software; the Free Software Foundation
 | 
					# This file is free software; the Free Software Foundation
 | 
				
			||||||
# gives unlimited permission to copy and/or distribute it,
 | 
					# gives unlimited permission to copy and/or distribute it,
 | 
				
			||||||
@@ -887,7 +887,7 @@ AC_DEFUN([AM_RUN_LOG],
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Check to make sure that the build environment is sane.    -*- Autoconf -*-
 | 
					# Check to make sure that the build environment is sane.    -*- Autoconf -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Copyright (C) 1996-2014 Free Software Foundation, Inc.
 | 
					# Copyright (C) 1996-2017 Free Software Foundation, Inc.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# This file is free software; the Free Software Foundation
 | 
					# This file is free software; the Free Software Foundation
 | 
				
			||||||
# gives unlimited permission to copy and/or distribute it,
 | 
					# gives unlimited permission to copy and/or distribute it,
 | 
				
			||||||
@@ -968,7 +968,7 @@ AC_CONFIG_COMMANDS_PRE(
 | 
				
			|||||||
rm -f conftest.file
 | 
					rm -f conftest.file
 | 
				
			||||||
])
 | 
					])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Copyright (C) 2009-2014 Free Software Foundation, Inc.
 | 
					# Copyright (C) 2009-2017 Free Software Foundation, Inc.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# This file is free software; the Free Software Foundation
 | 
					# This file is free software; the Free Software Foundation
 | 
				
			||||||
# gives unlimited permission to copy and/or distribute it,
 | 
					# gives unlimited permission to copy and/or distribute it,
 | 
				
			||||||
@@ -1028,7 +1028,7 @@ AC_SUBST([AM_BACKSLASH])dnl
 | 
				
			|||||||
_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
 | 
					_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl
 | 
				
			||||||
])
 | 
					])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Copyright (C) 2001-2014 Free Software Foundation, Inc.
 | 
					# Copyright (C) 2001-2017 Free Software Foundation, Inc.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# This file is free software; the Free Software Foundation
 | 
					# This file is free software; the Free Software Foundation
 | 
				
			||||||
# gives unlimited permission to copy and/or distribute it,
 | 
					# gives unlimited permission to copy and/or distribute it,
 | 
				
			||||||
@@ -1056,7 +1056,7 @@ fi
 | 
				
			|||||||
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 | 
					INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
 | 
				
			||||||
AC_SUBST([INSTALL_STRIP_PROGRAM])])
 | 
					AC_SUBST([INSTALL_STRIP_PROGRAM])])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Copyright (C) 2006-2014 Free Software Foundation, Inc.
 | 
					# Copyright (C) 2006-2017 Free Software Foundation, Inc.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# This file is free software; the Free Software Foundation
 | 
					# This file is free software; the Free Software Foundation
 | 
				
			||||||
# gives unlimited permission to copy and/or distribute it,
 | 
					# gives unlimited permission to copy and/or distribute it,
 | 
				
			||||||
@@ -1075,7 +1075,7 @@ AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# Check how to create a tarball.                            -*- Autoconf -*-
 | 
					# Check how to create a tarball.                            -*- Autoconf -*-
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Copyright (C) 2004-2014 Free Software Foundation, Inc.
 | 
					# Copyright (C) 2004-2017 Free Software Foundation, Inc.
 | 
				
			||||||
#
 | 
					#
 | 
				
			||||||
# This file is free software; the Free Software Foundation
 | 
					# This file is free software; the Free Software Foundation
 | 
				
			||||||
# gives unlimited permission to copy and/or distribute it,
 | 
					# gives unlimited permission to copy and/or distribute it,
 | 
				
			||||||
@@ -1207,6 +1207,7 @@ AC_SUBST([am__untar])
 | 
				
			|||||||
]) # _AM_PROG_TAR
 | 
					]) # _AM_PROG_TAR
 | 
				
			||||||
 | 
					
 | 
				
			||||||
m4_include([m4/as-gcc-inline-assembly.m4])
 | 
					m4_include([m4/as-gcc-inline-assembly.m4])
 | 
				
			||||||
 | 
					m4_include([m4/ax_add_fortify_source.m4])
 | 
				
			||||||
m4_include([m4/libtool.m4])
 | 
					m4_include([m4/libtool.m4])
 | 
				
			||||||
m4_include([m4/ltoptions.m4])
 | 
					m4_include([m4/ltoptions.m4])
 | 
				
			||||||
m4_include([m4/ltsugar.m4])
 | 
					m4_include([m4/ltsugar.m4])
 | 
				
			||||||
@@ -58,12 +58,12 @@
 | 
				
			|||||||
#   define S_MUL(a,b) MULT16_32_Q15(b, a)
 | 
					#   define S_MUL(a,b) MULT16_32_Q15(b, a)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#   define C_MUL(m,a,b) \
 | 
					#   define C_MUL(m,a,b) \
 | 
				
			||||||
      do{ (m).r = SUB32(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \
 | 
					      do{ (m).r = SUB32_ovflw(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \
 | 
				
			||||||
          (m).i = ADD32(S_MUL((a).r,(b).i) , S_MUL((a).i,(b).r)); }while(0)
 | 
					          (m).i = ADD32_ovflw(S_MUL((a).r,(b).i) , S_MUL((a).i,(b).r)); }while(0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#   define C_MULC(m,a,b) \
 | 
					#   define C_MULC(m,a,b) \
 | 
				
			||||||
      do{ (m).r = ADD32(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \
 | 
					      do{ (m).r = ADD32_ovflw(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \
 | 
				
			||||||
          (m).i = SUB32(S_MUL((a).i,(b).r) , S_MUL((a).r,(b).i)); }while(0)
 | 
					          (m).i = SUB32_ovflw(S_MUL((a).i,(b).r) , S_MUL((a).r,(b).i)); }while(0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#   define C_MULBYSCALAR( c, s ) \
 | 
					#   define C_MULBYSCALAR( c, s ) \
 | 
				
			||||||
      do{ (c).r =  S_MUL( (c).r , s ) ;\
 | 
					      do{ (c).r =  S_MUL( (c).r , s ) ;\
 | 
				
			||||||
@@ -77,17 +77,17 @@
 | 
				
			|||||||
                DIVSCALAR( (c).i  , div); }while (0)
 | 
					                DIVSCALAR( (c).i  , div); }while (0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define  C_ADD( res, a,b)\
 | 
					#define  C_ADD( res, a,b)\
 | 
				
			||||||
    do {(res).r=ADD32((a).r,(b).r);  (res).i=ADD32((a).i,(b).i); \
 | 
					    do {(res).r=ADD32_ovflw((a).r,(b).r);  (res).i=ADD32_ovflw((a).i,(b).i); \
 | 
				
			||||||
    }while(0)
 | 
					    }while(0)
 | 
				
			||||||
#define  C_SUB( res, a,b)\
 | 
					#define  C_SUB( res, a,b)\
 | 
				
			||||||
    do {(res).r=SUB32((a).r,(b).r);  (res).i=SUB32((a).i,(b).i); \
 | 
					    do {(res).r=SUB32_ovflw((a).r,(b).r);  (res).i=SUB32_ovflw((a).i,(b).i); \
 | 
				
			||||||
    }while(0)
 | 
					    }while(0)
 | 
				
			||||||
#define C_ADDTO( res , a)\
 | 
					#define C_ADDTO( res , a)\
 | 
				
			||||||
    do {(res).r = ADD32((res).r, (a).r);  (res).i = ADD32((res).i,(a).i);\
 | 
					    do {(res).r = ADD32_ovflw((res).r, (a).r);  (res).i = ADD32_ovflw((res).i,(a).i);\
 | 
				
			||||||
    }while(0)
 | 
					    }while(0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define C_SUBFROM( res , a)\
 | 
					#define C_SUBFROM( res , a)\
 | 
				
			||||||
    do {(res).r = ADD32((res).r,(a).r);  (res).i = SUB32((res).i,(a).i); \
 | 
					    do {(res).r = ADD32_ovflw((res).r,(a).r);  (res).i = SUB32_ovflw((res).i,(a).i); \
 | 
				
			||||||
    }while(0)
 | 
					    }while(0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(OPUS_ARM_INLINE_ASM)
 | 
					#if defined(OPUS_ARM_INLINE_ASM)
 | 
				
			||||||
@@ -46,25 +46,50 @@
 | 
				
			|||||||
#  endif
 | 
					#  endif
 | 
				
			||||||
# endif
 | 
					# endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if OPUS_GNUC_PREREQ(3, 0)
 | 
				
			||||||
 | 
					#define opus_likely(x)       (__builtin_expect(!!(x), 1))
 | 
				
			||||||
 | 
					#define opus_unlikely(x)     (__builtin_expect(!!(x), 0))
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define opus_likely(x)       (!!(x))
 | 
				
			||||||
 | 
					#define opus_unlikely(x)     (!!(x))
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CELT_SIG_SCALE 32768.f
 | 
					#define CELT_SIG_SCALE 32768.f
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define celt_fatal(str) _celt_fatal(str, __FILE__, __LINE__);
 | 
					#define CELT_FATAL(str) celt_fatal(str, __FILE__, __LINE__);
 | 
				
			||||||
#ifdef ENABLE_ASSERTIONS
 | 
					
 | 
				
			||||||
 | 
					#if defined(ENABLE_ASSERTIONS) || defined(ENABLE_HARDENING)
 | 
				
			||||||
 | 
					#ifdef __GNUC__
 | 
				
			||||||
 | 
					__attribute__((noreturn))
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					void celt_fatal(const char *str, const char *file, int line);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(CELT_C) && !defined(OVERRIDE_celt_fatal)
 | 
				
			||||||
#include <stdio.h>
 | 
					#include <stdio.h>
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
#ifdef __GNUC__
 | 
					#ifdef __GNUC__
 | 
				
			||||||
__attribute__((noreturn))
 | 
					__attribute__((noreturn))
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
static OPUS_INLINE void _celt_fatal(const char *str, const char *file, int line)
 | 
					void celt_fatal(const char *str, const char *file, int line)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   fprintf (stderr, "Fatal (internal) error in %s, line %d: %s\n", file, line, str);
 | 
					   fprintf (stderr, "Fatal (internal) error in %s, line %d: %s\n", file, line, str);
 | 
				
			||||||
   abort();
 | 
					   abort();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#define celt_assert(cond) {if (!(cond)) {celt_fatal("assertion failed: " #cond);}}
 | 
					#endif
 | 
				
			||||||
#define celt_assert2(cond, message) {if (!(cond)) {celt_fatal("assertion failed: " #cond "\n" message);}}
 | 
					
 | 
				
			||||||
 | 
					#define celt_assert(cond) {if (!(cond)) {CELT_FATAL("assertion failed: " #cond);}}
 | 
				
			||||||
 | 
					#define celt_assert2(cond, message) {if (!(cond)) {CELT_FATAL("assertion failed: " #cond "\n" message);}}
 | 
				
			||||||
 | 
					#define MUST_SUCCEED(call) celt_assert((call) == OPUS_OK)
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
#define celt_assert(cond)
 | 
					#define celt_assert(cond)
 | 
				
			||||||
#define celt_assert2(cond, message)
 | 
					#define celt_assert2(cond, message)
 | 
				
			||||||
 | 
					#define MUST_SUCCEED(call) do {if((call) != OPUS_OK) {RESTORE_STACK; return OPUS_INTERNAL_ERROR;} } while (0)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(ENABLE_ASSERTIONS)
 | 
				
			||||||
 | 
					#define celt_sig_assert(cond) {if (!(cond)) {CELT_FATAL("signal assertion failed: " #cond);}}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define celt_sig_assert(cond)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define IMUL32(a,b) ((a)*(b))
 | 
					#define IMUL32(a,b) ((a)*(b))
 | 
				
			||||||
@@ -78,20 +103,35 @@ static OPUS_INLINE void _celt_fatal(const char *str, const char *file, int line)
 | 
				
			|||||||
#define UADD32(a,b) ((a)+(b))
 | 
					#define UADD32(a,b) ((a)+(b))
 | 
				
			||||||
#define USUB32(a,b) ((a)-(b))
 | 
					#define USUB32(a,b) ((a)-(b))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Set this if opus_int64 is a native type of the CPU. */
 | 
				
			||||||
 | 
					/* Assume that all LP64 architectures have fast 64-bit types; also x86_64
 | 
				
			||||||
 | 
					   (which can be ILP32 for x32) and Win64 (which is LLP64). */
 | 
				
			||||||
 | 
					#if defined(__x86_64__) || defined(__LP64__) || defined(_WIN64)
 | 
				
			||||||
 | 
					#define OPUS_FAST_INT64 1
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define OPUS_FAST_INT64 0
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define PRINT_MIPS(file)
 | 
					#define PRINT_MIPS(file)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef FIXED_POINT
 | 
					#ifdef FIXED_POINT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef opus_int16 opus_val16;
 | 
					typedef opus_int16 opus_val16;
 | 
				
			||||||
typedef opus_int32 opus_val32;
 | 
					typedef opus_int32 opus_val32;
 | 
				
			||||||
 | 
					typedef opus_int64 opus_val64;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef opus_val32 celt_sig;
 | 
					typedef opus_val32 celt_sig;
 | 
				
			||||||
typedef opus_val16 celt_norm;
 | 
					typedef opus_val16 celt_norm;
 | 
				
			||||||
typedef opus_val32 celt_ener;
 | 
					typedef opus_val32 celt_ener;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define celt_isnan(x) 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define Q15ONE 32767
 | 
					#define Q15ONE 32767
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SIG_SHIFT 12
 | 
					#define SIG_SHIFT 12
 | 
				
			||||||
 | 
					/* Safe saturation value for 32-bit signals. Should be less than
 | 
				
			||||||
 | 
					   2^31*(1-0.85) to avoid blowing up on DC at deemphasis.*/
 | 
				
			||||||
 | 
					#define SIG_SAT (300000000)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define NORM_SCALING 16384
 | 
					#define NORM_SCALING 16384
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -118,7 +158,9 @@ static OPUS_INLINE opus_int16 SAT16(opus_int32 x) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#include "fixed_generic.h"
 | 
					#include "fixed_generic.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef OPUS_ARM_INLINE_EDSP
 | 
					#ifdef OPUS_ARM_PRESUME_AARCH64_NEON_INTR
 | 
				
			||||||
 | 
					#include "arm/fixed_arm64.h"
 | 
				
			||||||
 | 
					#elif defined (OPUS_ARM_INLINE_EDSP)
 | 
				
			||||||
#include "arm/fixed_armv5e.h"
 | 
					#include "arm/fixed_armv5e.h"
 | 
				
			||||||
#elif defined (OPUS_ARM_INLINE_ASM)
 | 
					#elif defined (OPUS_ARM_INLINE_ASM)
 | 
				
			||||||
#include "arm/fixed_armv4.h"
 | 
					#include "arm/fixed_armv4.h"
 | 
				
			||||||
@@ -136,6 +178,7 @@ static OPUS_INLINE opus_int16 SAT16(opus_int32 x) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
typedef float opus_val16;
 | 
					typedef float opus_val16;
 | 
				
			||||||
typedef float opus_val32;
 | 
					typedef float opus_val32;
 | 
				
			||||||
 | 
					typedef float opus_val64;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef float celt_sig;
 | 
					typedef float celt_sig;
 | 
				
			||||||
typedef float celt_norm;
 | 
					typedef float celt_norm;
 | 
				
			||||||
@@ -175,6 +218,7 @@ static OPUS_INLINE int celt_isnan(float x)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#define NEG16(x) (-(x))
 | 
					#define NEG16(x) (-(x))
 | 
				
			||||||
#define NEG32(x) (-(x))
 | 
					#define NEG32(x) (-(x))
 | 
				
			||||||
 | 
					#define NEG32_ovflw(x) (-(x))
 | 
				
			||||||
#define EXTRACT16(x) (x)
 | 
					#define EXTRACT16(x) (x)
 | 
				
			||||||
#define EXTEND32(x) (x)
 | 
					#define EXTEND32(x) (x)
 | 
				
			||||||
#define SHR16(a,shift) (a)
 | 
					#define SHR16(a,shift) (a)
 | 
				
			||||||
@@ -191,6 +235,7 @@ static OPUS_INLINE int celt_isnan(float x)
 | 
				
			|||||||
#define SATURATE16(x)   (x)
 | 
					#define SATURATE16(x)   (x)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ROUND16(a,shift)  (a)
 | 
					#define ROUND16(a,shift)  (a)
 | 
				
			||||||
 | 
					#define SROUND16(a,shift) (a)
 | 
				
			||||||
#define HALF16(x)       (.5f*(x))
 | 
					#define HALF16(x)       (.5f*(x))
 | 
				
			||||||
#define HALF32(x)       (.5f*(x))
 | 
					#define HALF32(x)       (.5f*(x))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -198,6 +243,8 @@ static OPUS_INLINE int celt_isnan(float x)
 | 
				
			|||||||
#define SUB16(a,b) ((a)-(b))
 | 
					#define SUB16(a,b) ((a)-(b))
 | 
				
			||||||
#define ADD32(a,b) ((a)+(b))
 | 
					#define ADD32(a,b) ((a)+(b))
 | 
				
			||||||
#define SUB32(a,b) ((a)-(b))
 | 
					#define SUB32(a,b) ((a)-(b))
 | 
				
			||||||
 | 
					#define ADD32_ovflw(a,b) ((a)+(b))
 | 
				
			||||||
 | 
					#define SUB32_ovflw(a,b) ((a)-(b))
 | 
				
			||||||
#define MULT16_16_16(a,b)     ((a)*(b))
 | 
					#define MULT16_16_16(a,b)     ((a)*(b))
 | 
				
			||||||
#define MULT16_16(a,b)     ((opus_val32)(a)*(opus_val32)(b))
 | 
					#define MULT16_16(a,b)     ((opus_val32)(a)*(opus_val32)(b))
 | 
				
			||||||
#define MAC16_16(c,a,b)     ((c)+(opus_val32)(a)*(opus_val32)(b))
 | 
					#define MAC16_16(c,a,b)     ((c)+(opus_val32)(a)*(opus_val32)(b))
 | 
				
			||||||
@@ -232,9 +279,9 @@ static OPUS_INLINE int celt_isnan(float x)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#ifndef GLOBAL_STACK_SIZE
 | 
					#ifndef GLOBAL_STACK_SIZE
 | 
				
			||||||
#ifdef FIXED_POINT
 | 
					#ifdef FIXED_POINT
 | 
				
			||||||
#define GLOBAL_STACK_SIZE 100000
 | 
					#define GLOBAL_STACK_SIZE 120000
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
#define GLOBAL_STACK_SIZE 100000
 | 
					#define GLOBAL_STACK_SIZE 120000
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -164,11 +164,11 @@ while (<>) {
 | 
				
			|||||||
        $prefix = "";
 | 
					        $prefix = "";
 | 
				
			||||||
        if ($proc)
 | 
					        if ($proc)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            $prefix = $prefix.sprintf("\t.type\t%s, %%function; ",$proc) unless ($apple);
 | 
					            $prefix = $prefix.sprintf("\t.type\t%s, %%function", $proc) unless ($apple);
 | 
				
			||||||
            # Make sure we $prefix isn't empty here (for the $apple case).
 | 
					            # Make sure we $prefix isn't empty here (for the $apple case).
 | 
				
			||||||
            # We handle mangling the label here, make sure it doesn't match
 | 
					            # We handle mangling the label here, make sure it doesn't match
 | 
				
			||||||
            # the label handling below (if $prefix would be empty).
 | 
					            # the label handling below (if $prefix would be empty).
 | 
				
			||||||
            $prefix = "; ";
 | 
					            $prefix = $prefix."; ";
 | 
				
			||||||
            push(@proc_stack, $proc);
 | 
					            push(@proc_stack, $proc);
 | 
				
			||||||
            s/^[A-Za-z_\.]\w+/$symprefix$&:/;
 | 
					            s/^[A-Za-z_\.]\w+/$symprefix$&:/;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -35,18 +35,40 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#if defined(OPUS_HAVE_RTCD)
 | 
					#if defined(OPUS_HAVE_RTCD)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)
 | 
				
			||||||
 | 
					opus_val32 (*const CELT_INNER_PROD_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *x, const opus_val16 *y, int N) = {
 | 
				
			||||||
 | 
					  celt_inner_prod_c,   /* ARMv4 */
 | 
				
			||||||
 | 
					  celt_inner_prod_c,   /* EDSP */
 | 
				
			||||||
 | 
					  celt_inner_prod_c,   /* Media */
 | 
				
			||||||
 | 
					  celt_inner_prod_neon /* NEON */
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void (*const DUAL_INNER_PROD_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *x, const opus_val16 *y01, const opus_val16 *y02,
 | 
				
			||||||
 | 
					      int N, opus_val32 *xy1, opus_val32 *xy2) = {
 | 
				
			||||||
 | 
					  dual_inner_prod_c,   /* ARMv4 */
 | 
				
			||||||
 | 
					  dual_inner_prod_c,   /* EDSP */
 | 
				
			||||||
 | 
					  dual_inner_prod_c,   /* Media */
 | 
				
			||||||
 | 
					  dual_inner_prod_neon /* NEON */
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					# endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# if defined(FIXED_POINT)
 | 
					# if defined(FIXED_POINT)
 | 
				
			||||||
 | 
					#  if ((defined(OPUS_ARM_MAY_HAVE_NEON) && !defined(OPUS_ARM_PRESUME_NEON)) || \
 | 
				
			||||||
 | 
					    (defined(OPUS_ARM_MAY_HAVE_MEDIA) && !defined(OPUS_ARM_PRESUME_MEDIA)) || \
 | 
				
			||||||
 | 
					    (defined(OPUS_ARM_MAY_HAVE_EDSP) && !defined(OPUS_ARM_PRESUME_EDSP)))
 | 
				
			||||||
opus_val32 (*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *,
 | 
					opus_val32 (*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *,
 | 
				
			||||||
    const opus_val16 *, opus_val32 *, int , int) = {
 | 
					    const opus_val16 *, opus_val32 *, int, int, int) = {
 | 
				
			||||||
  celt_pitch_xcorr_c,               /* ARMv4 */
 | 
					  celt_pitch_xcorr_c,               /* ARMv4 */
 | 
				
			||||||
  MAY_HAVE_EDSP(celt_pitch_xcorr),  /* EDSP */
 | 
					  MAY_HAVE_EDSP(celt_pitch_xcorr),  /* EDSP */
 | 
				
			||||||
  MAY_HAVE_MEDIA(celt_pitch_xcorr), /* Media */
 | 
					  MAY_HAVE_MEDIA(celt_pitch_xcorr), /* Media */
 | 
				
			||||||
  MAY_HAVE_NEON(celt_pitch_xcorr)   /* NEON */
 | 
					  MAY_HAVE_NEON(celt_pitch_xcorr)   /* NEON */
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  endif
 | 
				
			||||||
# else /* !FIXED_POINT */
 | 
					# else /* !FIXED_POINT */
 | 
				
			||||||
#  if defined(OPUS_ARM_MAY_HAVE_NEON_INTR)
 | 
					#  if defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)
 | 
				
			||||||
void (*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *,
 | 
					void (*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *,
 | 
				
			||||||
    const opus_val16 *, opus_val32 *, int, int) = {
 | 
					    const opus_val16 *, opus_val32 *, int, int, int) = {
 | 
				
			||||||
  celt_pitch_xcorr_c,              /* ARMv4 */
 | 
					  celt_pitch_xcorr_c,              /* ARMv4 */
 | 
				
			||||||
  celt_pitch_xcorr_c,              /* EDSP */
 | 
					  celt_pitch_xcorr_c,              /* EDSP */
 | 
				
			||||||
  celt_pitch_xcorr_c,              /* Media */
 | 
					  celt_pitch_xcorr_c,              /* Media */
 | 
				
			||||||
@@ -55,6 +77,23 @@ void (*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *,
 | 
				
			|||||||
#  endif
 | 
					#  endif
 | 
				
			||||||
# endif /* FIXED_POINT */
 | 
					# endif /* FIXED_POINT */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(FIXED_POINT) && defined(OPUS_HAVE_RTCD) && \
 | 
				
			||||||
 | 
					 defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void (*const XCORR_KERNEL_IMPL[OPUS_ARCHMASK + 1])(
 | 
				
			||||||
 | 
					         const opus_val16 *x,
 | 
				
			||||||
 | 
					         const opus_val16 *y,
 | 
				
			||||||
 | 
					         opus_val32       sum[4],
 | 
				
			||||||
 | 
					         int              len
 | 
				
			||||||
 | 
					) = {
 | 
				
			||||||
 | 
					  xcorr_kernel_c,                /* ARMv4 */
 | 
				
			||||||
 | 
					  xcorr_kernel_c,                /* EDSP */
 | 
				
			||||||
 | 
					  xcorr_kernel_c,                /* Media */
 | 
				
			||||||
 | 
					  xcorr_kernel_neon_fixed,       /* Neon */
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# if defined(OPUS_ARM_MAY_HAVE_NEON_INTR)
 | 
					# if defined(OPUS_ARM_MAY_HAVE_NEON_INTR)
 | 
				
			||||||
#  if defined(HAVE_ARM_NE10)
 | 
					#  if defined(HAVE_ARM_NE10)
 | 
				
			||||||
#   if defined(CUSTOM_MODES)
 | 
					#   if defined(CUSTOM_MODES)
 | 
				
			||||||
@@ -37,11 +37,12 @@
 | 
				
			|||||||
#include "cpu_support.h"
 | 
					#include "cpu_support.h"
 | 
				
			||||||
#include "os_support.h"
 | 
					#include "os_support.h"
 | 
				
			||||||
#include "opus_types.h"
 | 
					#include "opus_types.h"
 | 
				
			||||||
 | 
					#include "arch.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define OPUS_CPU_ARM_V4    (1)
 | 
					#define OPUS_CPU_ARM_V4_FLAG    (1<<OPUS_ARCH_ARM_V4)
 | 
				
			||||||
#define OPUS_CPU_ARM_EDSP  (1<<1)
 | 
					#define OPUS_CPU_ARM_EDSP_FLAG  (1<<OPUS_ARCH_ARM_EDSP)
 | 
				
			||||||
#define OPUS_CPU_ARM_MEDIA (1<<2)
 | 
					#define OPUS_CPU_ARM_MEDIA_FLAG (1<<OPUS_ARCH_ARM_MEDIA)
 | 
				
			||||||
#define OPUS_CPU_ARM_NEON  (1<<3)
 | 
					#define OPUS_CPU_ARM_NEON_FLAG  (1<<OPUS_ARCH_ARM_NEON)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(_MSC_VER)
 | 
					#if defined(_MSC_VER)
 | 
				
			||||||
/*For GetExceptionCode() and EXCEPTION_ILLEGAL_INSTRUCTION.*/
 | 
					/*For GetExceptionCode() and EXCEPTION_ILLEGAL_INSTRUCTION.*/
 | 
				
			||||||
@@ -55,20 +56,22 @@ static OPUS_INLINE opus_uint32 opus_cpu_capabilities(void){
 | 
				
			|||||||
  /* MSVC has no OPUS_INLINE __asm support for ARM, but it does let you __emit
 | 
					  /* MSVC has no OPUS_INLINE __asm support for ARM, but it does let you __emit
 | 
				
			||||||
   * instructions via their assembled hex code.
 | 
					   * instructions via their assembled hex code.
 | 
				
			||||||
   * All of these instructions should be essentially nops. */
 | 
					   * All of these instructions should be essentially nops. */
 | 
				
			||||||
# if defined(OPUS_ARM_MAY_HAVE_EDSP)
 | 
					# if defined(OPUS_ARM_MAY_HAVE_EDSP) || defined(OPUS_ARM_MAY_HAVE_MEDIA) \
 | 
				
			||||||
 | 
					 || defined(OPUS_ARM_MAY_HAVE_NEON) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR)
 | 
				
			||||||
  __try{
 | 
					  __try{
 | 
				
			||||||
    /*PLD [r13]*/
 | 
					    /*PLD [r13]*/
 | 
				
			||||||
    __emit(0xF5DDF000);
 | 
					    __emit(0xF5DDF000);
 | 
				
			||||||
    flags|=OPUS_CPU_ARM_EDSP;
 | 
					    flags|=OPUS_CPU_ARM_EDSP_FLAG;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  __except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION){
 | 
					  __except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION){
 | 
				
			||||||
    /*Ignore exception.*/
 | 
					    /*Ignore exception.*/
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
#  if defined(OPUS_ARM_MAY_HAVE_MEDIA)
 | 
					#  if defined(OPUS_ARM_MAY_HAVE_MEDIA) \
 | 
				
			||||||
 | 
					 || defined(OPUS_ARM_MAY_HAVE_NEON) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR)
 | 
				
			||||||
  __try{
 | 
					  __try{
 | 
				
			||||||
    /*SHADD8 r3,r3,r3*/
 | 
					    /*SHADD8 r3,r3,r3*/
 | 
				
			||||||
    __emit(0xE6333F93);
 | 
					    __emit(0xE6333F93);
 | 
				
			||||||
    flags|=OPUS_CPU_ARM_MEDIA;
 | 
					    flags|=OPUS_CPU_ARM_MEDIA_FLAG;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  __except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION){
 | 
					  __except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION){
 | 
				
			||||||
    /*Ignore exception.*/
 | 
					    /*Ignore exception.*/
 | 
				
			||||||
@@ -77,7 +80,7 @@ static OPUS_INLINE opus_uint32 opus_cpu_capabilities(void){
 | 
				
			|||||||
  __try{
 | 
					  __try{
 | 
				
			||||||
    /*VORR q0,q0,q0*/
 | 
					    /*VORR q0,q0,q0*/
 | 
				
			||||||
    __emit(0xF2200150);
 | 
					    __emit(0xF2200150);
 | 
				
			||||||
    flags|=OPUS_CPU_ARM_NEON;
 | 
					    flags|=OPUS_CPU_ARM_NEON_FLAG;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  __except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION){
 | 
					  __except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION){
 | 
				
			||||||
    /*Ignore exception.*/
 | 
					    /*Ignore exception.*/
 | 
				
			||||||
@@ -107,26 +110,26 @@ opus_uint32 opus_cpu_capabilities(void)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    while(fgets(buf, 512, cpuinfo) != NULL)
 | 
					    while(fgets(buf, 512, cpuinfo) != NULL)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
# if defined(OPUS_ARM_MAY_HAVE_EDSP) || defined(OPUS_ARM_MAY_HAVE_NEON) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR)
 | 
					# if defined(OPUS_ARM_MAY_HAVE_EDSP) || defined(OPUS_ARM_MAY_HAVE_MEDIA) \
 | 
				
			||||||
 | 
					 || defined(OPUS_ARM_MAY_HAVE_NEON) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR)
 | 
				
			||||||
      /* Search for edsp and neon flag */
 | 
					      /* Search for edsp and neon flag */
 | 
				
			||||||
      if(memcmp(buf, "Features", 8) == 0)
 | 
					      if(memcmp(buf, "Features", 8) == 0)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        char *p;
 | 
					        char *p;
 | 
				
			||||||
#  if defined(OPUS_ARM_MAY_HAVE_EDSP)
 | 
					 | 
				
			||||||
        p = strstr(buf, " edsp");
 | 
					        p = strstr(buf, " edsp");
 | 
				
			||||||
        if(p != NULL && (p[5] == ' ' || p[5] == '\n'))
 | 
					        if(p != NULL && (p[5] == ' ' || p[5] == '\n'))
 | 
				
			||||||
          flags |= OPUS_CPU_ARM_EDSP;
 | 
					          flags |= OPUS_CPU_ARM_EDSP_FLAG;
 | 
				
			||||||
#  endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#  if defined(OPUS_ARM_MAY_HAVE_NEON) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR)
 | 
					#  if defined(OPUS_ARM_MAY_HAVE_NEON) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR)
 | 
				
			||||||
        p = strstr(buf, " neon");
 | 
					        p = strstr(buf, " neon");
 | 
				
			||||||
        if(p != NULL && (p[5] == ' ' || p[5] == '\n'))
 | 
					        if(p != NULL && (p[5] == ' ' || p[5] == '\n'))
 | 
				
			||||||
          flags |= OPUS_CPU_ARM_NEON;
 | 
					          flags |= OPUS_CPU_ARM_NEON_FLAG;
 | 
				
			||||||
#  endif
 | 
					#  endif
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
# endif
 | 
					# endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# if defined(OPUS_ARM_MAY_HAVE_MEDIA)
 | 
					# if defined(OPUS_ARM_MAY_HAVE_MEDIA) \
 | 
				
			||||||
 | 
					 || defined(OPUS_ARM_MAY_HAVE_NEON) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR)
 | 
				
			||||||
      /* Search for media capabilities (>= ARMv6) */
 | 
					      /* Search for media capabilities (>= ARMv6) */
 | 
				
			||||||
      if(memcmp(buf, "CPU architecture:", 17) == 0)
 | 
					      if(memcmp(buf, "CPU architecture:", 17) == 0)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
@@ -134,7 +137,7 @@ opus_uint32 opus_cpu_capabilities(void)
 | 
				
			|||||||
        version = atoi(buf+17);
 | 
					        version = atoi(buf+17);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if(version >= 6)
 | 
					        if(version >= 6)
 | 
				
			||||||
          flags |= OPUS_CPU_ARM_MEDIA;
 | 
					          flags |= OPUS_CPU_ARM_MEDIA_FLAG;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
# endif
 | 
					# endif
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -156,18 +159,26 @@ int opus_select_arch(void)
 | 
				
			|||||||
  opus_uint32 flags = opus_cpu_capabilities();
 | 
					  opus_uint32 flags = opus_cpu_capabilities();
 | 
				
			||||||
  int arch = 0;
 | 
					  int arch = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if(!(flags & OPUS_CPU_ARM_EDSP))
 | 
					  if(!(flags & OPUS_CPU_ARM_EDSP_FLAG)) {
 | 
				
			||||||
 | 
					    /* Asserts ensure arch values are sequential */
 | 
				
			||||||
 | 
					    celt_assert(arch == OPUS_ARCH_ARM_V4);
 | 
				
			||||||
    return arch;
 | 
					    return arch;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  arch++;
 | 
					  arch++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if(!(flags & OPUS_CPU_ARM_MEDIA))
 | 
					  if(!(flags & OPUS_CPU_ARM_MEDIA_FLAG)) {
 | 
				
			||||||
 | 
					    celt_assert(arch == OPUS_ARCH_ARM_EDSP);
 | 
				
			||||||
    return arch;
 | 
					    return arch;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  arch++;
 | 
					  arch++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if(!(flags & OPUS_CPU_ARM_NEON))
 | 
					  if(!(flags & OPUS_CPU_ARM_NEON_FLAG)) {
 | 
				
			||||||
 | 
					    celt_assert(arch == OPUS_ARCH_ARM_MEDIA);
 | 
				
			||||||
    return arch;
 | 
					    return arch;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  arch++;
 | 
					  arch++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  celt_assert(arch == OPUS_ARCH_ARM_NEON);
 | 
				
			||||||
  return arch;
 | 
					  return arch;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -66,6 +66,12 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# if defined(OPUS_HAVE_RTCD)
 | 
					# if defined(OPUS_HAVE_RTCD)
 | 
				
			||||||
int opus_select_arch(void);
 | 
					int opus_select_arch(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define OPUS_ARCH_ARM_V4    (0)
 | 
				
			||||||
 | 
					#define OPUS_ARCH_ARM_EDSP  (1)
 | 
				
			||||||
 | 
					#define OPUS_ARCH_ARM_MEDIA (2)
 | 
				
			||||||
 | 
					#define OPUS_ARCH_ARM_NEON  (3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# endif
 | 
					# endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/* Copyright (c) 2015 Xiph.Org Foundation
 | 
					/* Copyright (c) 2015 Xiph.Org Foundation
 | 
				
			||||||
   Written by Viswanath Puttagunta */
 | 
					   Written by Viswanath Puttagunta */
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
   @file celt_ne10_fft.c
 | 
					   @file celt_fft_ne10.c
 | 
				
			||||||
   @brief ARM Neon optimizations for fft using NE10 library
 | 
					   @brief ARM Neon optimizations for fft using NE10 library
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -36,7 +36,6 @@
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <NE10_init.h>
 | 
					 | 
				
			||||||
#include <NE10_dsp.h>
 | 
					#include <NE10_dsp.h>
 | 
				
			||||||
#include "os_support.h"
 | 
					#include "os_support.h"
 | 
				
			||||||
#include "kiss_fft.h"
 | 
					#include "kiss_fft.h"
 | 
				
			||||||
@@ -1,7 +1,7 @@
 | 
				
			|||||||
/* Copyright (c) 2015 Xiph.Org Foundation
 | 
					/* Copyright (c) 2015 Xiph.Org Foundation
 | 
				
			||||||
   Written by Viswanath Puttagunta */
 | 
					   Written by Viswanath Puttagunta */
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
   @file celt_ne10_mdct.c
 | 
					   @file celt_mdct_ne10.c
 | 
				
			||||||
   @brief ARM Neon optimizations for mdct using NE10 library
 | 
					   @brief ARM Neon optimizations for mdct using NE10 library
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -37,7 +37,66 @@
 | 
				
			|||||||
#include <arm_neon.h>
 | 
					#include <arm_neon.h>
 | 
				
			||||||
#include "../pitch.h"
 | 
					#include "../pitch.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if !defined(FIXED_POINT)
 | 
					#if defined(FIXED_POINT)
 | 
				
			||||||
 | 
					void xcorr_kernel_neon_fixed(const opus_val16 * x, const opus_val16 * y, opus_val32 sum[4], int len)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   int j;
 | 
				
			||||||
 | 
					   int32x4_t a = vld1q_s32(sum);
 | 
				
			||||||
 | 
					   /* Load y[0...3] */
 | 
				
			||||||
 | 
					   /* This requires len>0 to always be valid (which we assert in the C code). */
 | 
				
			||||||
 | 
					   int16x4_t y0 = vld1_s16(y);
 | 
				
			||||||
 | 
					   y += 4;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   for (j = 0; j + 8 <= len; j += 8)
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					      /* Load x[0...7] */
 | 
				
			||||||
 | 
					      int16x8_t xx = vld1q_s16(x);
 | 
				
			||||||
 | 
					      int16x4_t x0 = vget_low_s16(xx);
 | 
				
			||||||
 | 
					      int16x4_t x4 = vget_high_s16(xx);
 | 
				
			||||||
 | 
					      /* Load y[4...11] */
 | 
				
			||||||
 | 
					      int16x8_t yy = vld1q_s16(y);
 | 
				
			||||||
 | 
					      int16x4_t y4 = vget_low_s16(yy);
 | 
				
			||||||
 | 
					      int16x4_t y8 = vget_high_s16(yy);
 | 
				
			||||||
 | 
					      int32x4_t a0 = vmlal_lane_s16(a, y0, x0, 0);
 | 
				
			||||||
 | 
					      int32x4_t a1 = vmlal_lane_s16(a0, y4, x4, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      int16x4_t y1 = vext_s16(y0, y4, 1);
 | 
				
			||||||
 | 
					      int16x4_t y5 = vext_s16(y4, y8, 1);
 | 
				
			||||||
 | 
					      int32x4_t a2 = vmlal_lane_s16(a1, y1, x0, 1);
 | 
				
			||||||
 | 
					      int32x4_t a3 = vmlal_lane_s16(a2, y5, x4, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      int16x4_t y2 = vext_s16(y0, y4, 2);
 | 
				
			||||||
 | 
					      int16x4_t y6 = vext_s16(y4, y8, 2);
 | 
				
			||||||
 | 
					      int32x4_t a4 = vmlal_lane_s16(a3, y2, x0, 2);
 | 
				
			||||||
 | 
					      int32x4_t a5 = vmlal_lane_s16(a4, y6, x4, 2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      int16x4_t y3 = vext_s16(y0, y4, 3);
 | 
				
			||||||
 | 
					      int16x4_t y7 = vext_s16(y4, y8, 3);
 | 
				
			||||||
 | 
					      int32x4_t a6 = vmlal_lane_s16(a5, y3, x0, 3);
 | 
				
			||||||
 | 
					      int32x4_t a7 = vmlal_lane_s16(a6, y7, x4, 3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      y0 = y8;
 | 
				
			||||||
 | 
					      a = a7;
 | 
				
			||||||
 | 
					      x += 8;
 | 
				
			||||||
 | 
					      y += 8;
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   for (; j < len; j++)
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					      int16x4_t x0 = vld1_dup_s16(x);  /* load next x */
 | 
				
			||||||
 | 
					      int32x4_t a0 = vmlal_s16(a, y0, x0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      int16x4_t y4 = vld1_dup_s16(y);  /* load next y */
 | 
				
			||||||
 | 
					      y0 = vext_s16(y0, y4, 1);
 | 
				
			||||||
 | 
					      a = a0;
 | 
				
			||||||
 | 
					      x++;
 | 
				
			||||||
 | 
					      y++;
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   vst1q_s32(sum, a);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Function: xcorr_kernel_neon_float
 | 
					 * Function: xcorr_kernel_neon_float
 | 
				
			||||||
 * ---------------------------------
 | 
					 * ---------------------------------
 | 
				
			||||||
@@ -132,121 +191,21 @@ static void xcorr_kernel_neon_float(const float32_t *x, const float32_t *y,
 | 
				
			|||||||
   vst1q_f32(sum, SUMM);
 | 
					   vst1q_f32(sum, SUMM);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Function: xcorr_kernel_neon_float_process1
 | 
					 | 
				
			||||||
 * ---------------------------------
 | 
					 | 
				
			||||||
 * Computes single correlation values and stores in *sum
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
static void xcorr_kernel_neon_float_process1(const float32_t *x,
 | 
					 | 
				
			||||||
      const float32_t *y, float32_t *sum, int len) {
 | 
					 | 
				
			||||||
   float32x4_t XX[4];
 | 
					 | 
				
			||||||
   float32x4_t YY[4];
 | 
					 | 
				
			||||||
   float32x2_t XX_2;
 | 
					 | 
				
			||||||
   float32x2_t YY_2;
 | 
					 | 
				
			||||||
   float32x4_t SUMM;
 | 
					 | 
				
			||||||
   float32x2_t SUMM_2[2];
 | 
					 | 
				
			||||||
   const float32_t *xi = x;
 | 
					 | 
				
			||||||
   const float32_t *yi = y;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   SUMM = vdupq_n_f32(0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   /* Work on 16 values per iteration */
 | 
					 | 
				
			||||||
   while (len >= 16) {
 | 
					 | 
				
			||||||
      XX[0] = vld1q_f32(xi);
 | 
					 | 
				
			||||||
      xi += 4;
 | 
					 | 
				
			||||||
      XX[1] = vld1q_f32(xi);
 | 
					 | 
				
			||||||
      xi += 4;
 | 
					 | 
				
			||||||
      XX[2] = vld1q_f32(xi);
 | 
					 | 
				
			||||||
      xi += 4;
 | 
					 | 
				
			||||||
      XX[3] = vld1q_f32(xi);
 | 
					 | 
				
			||||||
      xi += 4;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      YY[0] = vld1q_f32(yi);
 | 
					 | 
				
			||||||
      yi += 4;
 | 
					 | 
				
			||||||
      YY[1] = vld1q_f32(yi);
 | 
					 | 
				
			||||||
      yi += 4;
 | 
					 | 
				
			||||||
      YY[2] = vld1q_f32(yi);
 | 
					 | 
				
			||||||
      yi += 4;
 | 
					 | 
				
			||||||
      YY[3] = vld1q_f32(yi);
 | 
					 | 
				
			||||||
      yi += 4;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      SUMM = vmlaq_f32(SUMM, YY[0], XX[0]);
 | 
					 | 
				
			||||||
      SUMM = vmlaq_f32(SUMM, YY[1], XX[1]);
 | 
					 | 
				
			||||||
      SUMM = vmlaq_f32(SUMM, YY[2], XX[2]);
 | 
					 | 
				
			||||||
      SUMM = vmlaq_f32(SUMM, YY[3], XX[3]);
 | 
					 | 
				
			||||||
      len -= 16;
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   /* Work on 8 values */
 | 
					 | 
				
			||||||
   if (len >= 8) {
 | 
					 | 
				
			||||||
      XX[0] = vld1q_f32(xi);
 | 
					 | 
				
			||||||
      xi += 4;
 | 
					 | 
				
			||||||
      XX[1] = vld1q_f32(xi);
 | 
					 | 
				
			||||||
      xi += 4;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      YY[0] = vld1q_f32(yi);
 | 
					 | 
				
			||||||
      yi += 4;
 | 
					 | 
				
			||||||
      YY[1] = vld1q_f32(yi);
 | 
					 | 
				
			||||||
      yi += 4;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      SUMM = vmlaq_f32(SUMM, YY[0], XX[0]);
 | 
					 | 
				
			||||||
      SUMM = vmlaq_f32(SUMM, YY[1], XX[1]);
 | 
					 | 
				
			||||||
      len -= 8;
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   /* Work on 4 values */
 | 
					 | 
				
			||||||
   if (len >= 4) {
 | 
					 | 
				
			||||||
      XX[0] = vld1q_f32(xi);
 | 
					 | 
				
			||||||
      xi += 4;
 | 
					 | 
				
			||||||
      YY[0] = vld1q_f32(yi);
 | 
					 | 
				
			||||||
      yi += 4;
 | 
					 | 
				
			||||||
      SUMM = vmlaq_f32(SUMM, YY[0], XX[0]);
 | 
					 | 
				
			||||||
      len -= 4;
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   /* Start accumulating results */
 | 
					 | 
				
			||||||
   SUMM_2[0] = vget_low_f32(SUMM);
 | 
					 | 
				
			||||||
   if (len >= 2) {
 | 
					 | 
				
			||||||
      /* While at it, consume 2 more values if available */
 | 
					 | 
				
			||||||
      XX_2 = vld1_f32(xi);
 | 
					 | 
				
			||||||
      xi += 2;
 | 
					 | 
				
			||||||
      YY_2 = vld1_f32(yi);
 | 
					 | 
				
			||||||
      yi += 2;
 | 
					 | 
				
			||||||
      SUMM_2[0] = vmla_f32(SUMM_2[0], YY_2, XX_2);
 | 
					 | 
				
			||||||
      len -= 2;
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
   SUMM_2[1] = vget_high_f32(SUMM);
 | 
					 | 
				
			||||||
   SUMM_2[0] = vadd_f32(SUMM_2[0], SUMM_2[1]);
 | 
					 | 
				
			||||||
   SUMM_2[0] = vpadd_f32(SUMM_2[0], SUMM_2[0]);
 | 
					 | 
				
			||||||
   /* Ok, now we have result accumulated in SUMM_2[0].0 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   if (len > 0) {
 | 
					 | 
				
			||||||
      /* Case when you have one value left */
 | 
					 | 
				
			||||||
      XX_2 = vld1_dup_f32(xi);
 | 
					 | 
				
			||||||
      YY_2 = vld1_dup_f32(yi);
 | 
					 | 
				
			||||||
      SUMM_2[0] = vmla_f32(SUMM_2[0], XX_2, YY_2);
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   vst1_lane_f32(sum, SUMM_2[0], 0);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void celt_pitch_xcorr_float_neon(const opus_val16 *_x, const opus_val16 *_y,
 | 
					void celt_pitch_xcorr_float_neon(const opus_val16 *_x, const opus_val16 *_y,
 | 
				
			||||||
                        opus_val32 *xcorr, int len, int max_pitch) {
 | 
					                        opus_val32 *xcorr, int len, int max_pitch, int arch) {
 | 
				
			||||||
   int i;
 | 
					   int i;
 | 
				
			||||||
 | 
					   (void)arch;
 | 
				
			||||||
   celt_assert(max_pitch > 0);
 | 
					   celt_assert(max_pitch > 0);
 | 
				
			||||||
   celt_assert((((unsigned char *)_x-(unsigned char *)NULL)&3)==0);
 | 
					   celt_sig_assert((((unsigned char *)_x-(unsigned char *)NULL)&3)==0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   for (i = 0; i < (max_pitch-3); i += 4) {
 | 
					   for (i = 0; i < (max_pitch-3); i += 4) {
 | 
				
			||||||
      xcorr_kernel_neon_float((const float32_t *)_x, (const float32_t *)_y+i,
 | 
					      xcorr_kernel_neon_float((const float32_t *)_x, (const float32_t *)_y+i,
 | 
				
			||||||
            (float32_t *)xcorr+i, len);
 | 
					            (float32_t *)xcorr+i, len);
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   /* In case max_pitch isn't multiple of 4
 | 
					   /* In case max_pitch isn't a multiple of 4, do non-unrolled version. */
 | 
				
			||||||
    * compute single correlation value per iteration
 | 
					 | 
				
			||||||
    */
 | 
					 | 
				
			||||||
   for (; i < max_pitch; i++) {
 | 
					   for (; i < max_pitch; i++) {
 | 
				
			||||||
      xcorr_kernel_neon_float_process1((const float32_t *)_x,
 | 
					      xcorr[i] = celt_inner_prod_neon(_x, _y+i, len);
 | 
				
			||||||
            (const float32_t *)_y+i, (float32_t *)xcorr+i, len);
 | 
					 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
@@ -44,7 +44,7 @@
 | 
				
			|||||||
 .if OPUS_ARM_MAY_HAVE_NEON
 | 
					 .if OPUS_ARM_MAY_HAVE_NEON
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ Compute sum[k]=sum(x[j]*y[j+k],j=0...len-1), k=0...3
 | 
					@ Compute sum[k]=sum(x[j]*y[j+k],j=0...len-1), k=0...3
 | 
				
			||||||
; xcorr_kernel_neon: @ PROC
 | 
						.type	xcorr_kernel_neon, %function; xcorr_kernel_neon: @ PROC
 | 
				
			||||||
xcorr_kernel_neon_start:
 | 
					xcorr_kernel_neon_start:
 | 
				
			||||||
  @ input:
 | 
					  @ input:
 | 
				
			||||||
  @   r3     = int         len
 | 
					  @   r3     = int         len
 | 
				
			||||||
@@ -156,8 +156,8 @@ xcorr_kernel_neon_process1:
 | 
				
			|||||||
	.size xcorr_kernel_neon, .-xcorr_kernel_neon  @ ENDP
 | 
						.size xcorr_kernel_neon, .-xcorr_kernel_neon  @ ENDP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ opus_val32 celt_pitch_xcorr_neon(opus_val16 *_x, opus_val16 *_y,
 | 
					@ opus_val32 celt_pitch_xcorr_neon(opus_val16 *_x, opus_val16 *_y,
 | 
				
			||||||
@  opus_val32 *xcorr, int len, int max_pitch)
 | 
					@  opus_val32 *xcorr, int len, int max_pitch, int arch)
 | 
				
			||||||
; celt_pitch_xcorr_neon: @ PROC
 | 
						.type	celt_pitch_xcorr_neon, %function; celt_pitch_xcorr_neon: @ PROC
 | 
				
			||||||
  @ input:
 | 
					  @ input:
 | 
				
			||||||
  @   r0  = opus_val16 *_x
 | 
					  @   r0  = opus_val16 *_x
 | 
				
			||||||
  @   r1  = opus_val16 *_y
 | 
					  @   r1  = opus_val16 *_y
 | 
				
			||||||
@@ -171,6 +171,8 @@ xcorr_kernel_neon_process1:
 | 
				
			|||||||
  @   r6  = int         max_pitch
 | 
					  @   r6  = int         max_pitch
 | 
				
			||||||
  @   r12 = int         j
 | 
					  @   r12 = int         j
 | 
				
			||||||
  @   q15 = int         maxcorr[4] (q15 is not used by xcorr_kernel_neon())
 | 
					  @   q15 = int         maxcorr[4] (q15 is not used by xcorr_kernel_neon())
 | 
				
			||||||
 | 
					  @ ignored:
 | 
				
			||||||
 | 
					  @         int         arch
 | 
				
			||||||
  STMFD        sp!, {r4-r6, lr}
 | 
					  STMFD        sp!, {r4-r6, lr}
 | 
				
			||||||
  LDR          r6, [sp, #16]
 | 
					  LDR          r6, [sp, #16]
 | 
				
			||||||
  VMOV.S32     q15, #1
 | 
					  VMOV.S32     q15, #1
 | 
				
			||||||
@@ -260,7 +262,7 @@ celt_pitch_xcorr_neon_done:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
@ This will get used on ARMv7 devices without NEON, so it has been optimized
 | 
					@ This will get used on ARMv7 devices without NEON, so it has been optimized
 | 
				
			||||||
@ to take advantage of dual-issuing where possible.
 | 
					@ to take advantage of dual-issuing where possible.
 | 
				
			||||||
; xcorr_kernel_edsp: @ PROC
 | 
						.type	xcorr_kernel_edsp, %function; xcorr_kernel_edsp: @ PROC
 | 
				
			||||||
xcorr_kernel_edsp_start:
 | 
					xcorr_kernel_edsp_start:
 | 
				
			||||||
  @ input:
 | 
					  @ input:
 | 
				
			||||||
  @   r3      = int         len
 | 
					  @   r3      = int         len
 | 
				
			||||||
@@ -344,7 +346,7 @@ xcorr_kernel_edsp_done:
 | 
				
			|||||||
  LDMFD        sp!, {r2,r4,r5,pc}
 | 
					  LDMFD        sp!, {r2,r4,r5,pc}
 | 
				
			||||||
	.size xcorr_kernel_edsp, .-xcorr_kernel_edsp  @ ENDP
 | 
						.size xcorr_kernel_edsp, .-xcorr_kernel_edsp  @ ENDP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
; celt_pitch_xcorr_edsp: @ PROC
 | 
						.type	celt_pitch_xcorr_edsp, %function; celt_pitch_xcorr_edsp: @ PROC
 | 
				
			||||||
  @ input:
 | 
					  @ input:
 | 
				
			||||||
  @   r0  = opus_val16 *_x (must be 32-bit aligned)
 | 
					  @   r0  = opus_val16 *_x (must be 32-bit aligned)
 | 
				
			||||||
  @   r1  = opus_val16 *_y (only needs to be 16-bit aligned)
 | 
					  @   r1  = opus_val16 *_y (only needs to be 16-bit aligned)
 | 
				
			||||||
@@ -361,6 +363,8 @@ xcorr_kernel_edsp_done:
 | 
				
			|||||||
  @   r9  = opus_val32  sum3
 | 
					  @   r9  = opus_val32  sum3
 | 
				
			||||||
  @   r1  = int         max_pitch
 | 
					  @   r1  = int         max_pitch
 | 
				
			||||||
  @   r12 = int         j
 | 
					  @   r12 = int         j
 | 
				
			||||||
 | 
					  @ ignored:
 | 
				
			||||||
 | 
					  @         int         arch
 | 
				
			||||||
  STMFD        sp!, {r4-r11, lr}
 | 
					  STMFD        sp!, {r4-r11, lr}
 | 
				
			||||||
  MOV          r5, r1
 | 
					  MOV          r5, r1
 | 
				
			||||||
  LDR          r1, [sp, #36]
 | 
					  LDR          r1, [sp, #36]
 | 
				
			||||||
@@ -153,7 +153,7 @@ xcorr_kernel_neon_process1
 | 
				
			|||||||
  ENDP
 | 
					  ENDP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
; opus_val32 celt_pitch_xcorr_neon(opus_val16 *_x, opus_val16 *_y,
 | 
					; opus_val32 celt_pitch_xcorr_neon(opus_val16 *_x, opus_val16 *_y,
 | 
				
			||||||
;  opus_val32 *xcorr, int len, int max_pitch)
 | 
					;  opus_val32 *xcorr, int len, int max_pitch, int arch)
 | 
				
			||||||
celt_pitch_xcorr_neon PROC
 | 
					celt_pitch_xcorr_neon PROC
 | 
				
			||||||
  ; input:
 | 
					  ; input:
 | 
				
			||||||
  ;   r0  = opus_val16 *_x
 | 
					  ;   r0  = opus_val16 *_x
 | 
				
			||||||
@@ -168,6 +168,8 @@ celt_pitch_xcorr_neon PROC
 | 
				
			|||||||
  ;   r6  = int         max_pitch
 | 
					  ;   r6  = int         max_pitch
 | 
				
			||||||
  ;   r12 = int         j
 | 
					  ;   r12 = int         j
 | 
				
			||||||
  ;   q15 = int         maxcorr[4] (q15 is not used by xcorr_kernel_neon())
 | 
					  ;   q15 = int         maxcorr[4] (q15 is not used by xcorr_kernel_neon())
 | 
				
			||||||
 | 
					  ; ignored:
 | 
				
			||||||
 | 
					  ;         int         arch
 | 
				
			||||||
  STMFD        sp!, {r4-r6, lr}
 | 
					  STMFD        sp!, {r4-r6, lr}
 | 
				
			||||||
  LDR          r6, [sp, #16]
 | 
					  LDR          r6, [sp, #16]
 | 
				
			||||||
  VMOV.S32     q15, #1
 | 
					  VMOV.S32     q15, #1
 | 
				
			||||||
@@ -358,6 +360,8 @@ celt_pitch_xcorr_edsp PROC
 | 
				
			|||||||
  ;   r9  = opus_val32  sum3
 | 
					  ;   r9  = opus_val32  sum3
 | 
				
			||||||
  ;   r1  = int         max_pitch
 | 
					  ;   r1  = int         max_pitch
 | 
				
			||||||
  ;   r12 = int         j
 | 
					  ;   r12 = int         j
 | 
				
			||||||
 | 
					  ; ignored:
 | 
				
			||||||
 | 
					  ;         int         arch
 | 
				
			||||||
  STMFD        sp!, {r4-r11, lr}
 | 
					  STMFD        sp!, {r4-r11, lr}
 | 
				
			||||||
  MOV          r5, r1
 | 
					  MOV          r5, r1
 | 
				
			||||||
  LDR          r1, [sp, #36]
 | 
					  LDR          r1, [sp, #36]
 | 
				
			||||||
@@ -34,7 +34,6 @@
 | 
				
			|||||||
#if !defined(FFT_ARM_H)
 | 
					#if !defined(FFT_ARM_H)
 | 
				
			||||||
#define FFT_ARM_H
 | 
					#define FFT_ARM_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "config.h"
 | 
					 | 
				
			||||||
#include "kiss_fft.h"
 | 
					#include "kiss_fft.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(HAVE_ARM_NE10)
 | 
					#if defined(HAVE_ARM_NE10)
 | 
				
			||||||
@@ -1,5 +1,4 @@
 | 
				
			|||||||
/* Copyright (c) 2008-2011 Octasic Inc.
 | 
					/* Copyright (C) 2015 Vidyo */
 | 
				
			||||||
   Written by Jean-Marc Valin */
 | 
					 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
   Redistribution and use in source and binary forms, with or without
 | 
					   Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
   modification, are permitted provided that the following conditions
 | 
					   modification, are permitted provided that the following conditions
 | 
				
			||||||
@@ -15,8 +14,8 @@
 | 
				
			|||||||
   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
					   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
				
			||||||
   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
					   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
				
			||||||
   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
					   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
				
			||||||
   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
 | 
					   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
 | 
				
			||||||
   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 | 
					   OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 | 
				
			||||||
   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 | 
					   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 | 
				
			||||||
   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 | 
					   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 | 
				
			||||||
   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 | 
					   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 | 
				
			||||||
@@ -25,19 +24,12 @@
 | 
				
			|||||||
   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
					   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef _MLP_H_
 | 
					#ifndef FIXED_ARM64_H
 | 
				
			||||||
#define _MLP_H_
 | 
					#define FIXED_ARM64_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "arch.h"
 | 
					#include <arm_neon.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					#undef SIG2WORD16
 | 
				
			||||||
    int layers;
 | 
					#define SIG2WORD16(x) (vqmovns_s32(PSHR32((x), SIG_SHIFT)))
 | 
				
			||||||
    const int *topo;
 | 
					 | 
				
			||||||
    const float *weights;
 | 
					 | 
				
			||||||
} MLP;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern const MLP net;
 | 
					#endif
 | 
				
			||||||
 | 
					 | 
				
			||||||
void mlp_process(const MLP *m, const float *in, float *out);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif /* _MLP_H_ */
 | 
					 | 
				
			||||||
@@ -37,7 +37,7 @@ static OPUS_INLINE opus_val32 MULT16_32_Q16_armv4(opus_val16 a, opus_val32 b)
 | 
				
			|||||||
      "#MULT16_32_Q16\n\t"
 | 
					      "#MULT16_32_Q16\n\t"
 | 
				
			||||||
      "smull %0, %1, %2, %3\n\t"
 | 
					      "smull %0, %1, %2, %3\n\t"
 | 
				
			||||||
      : "=&r"(rd_lo), "=&r"(rd_hi)
 | 
					      : "=&r"(rd_lo), "=&r"(rd_hi)
 | 
				
			||||||
      : "%r"(b),"r"(a<<16)
 | 
					      : "%r"(b),"r"(SHL32(a,16))
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
  return rd_hi;
 | 
					  return rd_hi;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -54,10 +54,10 @@ static OPUS_INLINE opus_val32 MULT16_32_Q15_armv4(opus_val16 a, opus_val32 b)
 | 
				
			|||||||
      "#MULT16_32_Q15\n\t"
 | 
					      "#MULT16_32_Q15\n\t"
 | 
				
			||||||
      "smull %0, %1, %2, %3\n\t"
 | 
					      "smull %0, %1, %2, %3\n\t"
 | 
				
			||||||
      : "=&r"(rd_lo), "=&r"(rd_hi)
 | 
					      : "=&r"(rd_lo), "=&r"(rd_hi)
 | 
				
			||||||
      : "%r"(b), "r"(a<<16)
 | 
					      : "%r"(b), "r"(SHL32(a,16))
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
  /*We intentionally don't OR in the high bit of rd_lo for speed.*/
 | 
					  /*We intentionally don't OR in the high bit of rd_lo for speed.*/
 | 
				
			||||||
  return rd_hi<<1;
 | 
					  return SHL32(rd_hi,1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#define MULT16_32_Q15(a, b) (MULT16_32_Q15_armv4(a, b))
 | 
					#define MULT16_32_Q15(a, b) (MULT16_32_Q15_armv4(a, b))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -59,7 +59,7 @@ static OPUS_INLINE opus_val32 MULT16_32_Q15_armv5e(opus_val16 a, opus_val32 b)
 | 
				
			|||||||
      : "=r"(res)
 | 
					      : "=r"(res)
 | 
				
			||||||
      : "r"(b), "r"(a)
 | 
					      : "r"(b), "r"(a)
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
  return res<<1;
 | 
					  return SHL32(res,1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#define MULT16_32_Q15(a, b) (MULT16_32_Q15_armv5e(a, b))
 | 
					#define MULT16_32_Q15(a, b) (MULT16_32_Q15_armv5e(a, b))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -76,7 +76,7 @@ static OPUS_INLINE opus_val32 MAC16_32_Q15_armv5e(opus_val32 c, opus_val16 a,
 | 
				
			|||||||
      "#MAC16_32_Q15\n\t"
 | 
					      "#MAC16_32_Q15\n\t"
 | 
				
			||||||
      "smlawb %0, %1, %2, %3;\n"
 | 
					      "smlawb %0, %1, %2, %3;\n"
 | 
				
			||||||
      : "=r"(res)
 | 
					      : "=r"(res)
 | 
				
			||||||
      : "r"(b<<1), "r"(a), "r"(c)
 | 
					      : "r"(SHL32(b,1)), "r"(a), "r"(c)
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
  return res;
 | 
					  return res;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -33,7 +33,6 @@
 | 
				
			|||||||
#if !defined(MDCT_ARM_H)
 | 
					#if !defined(MDCT_ARM_H)
 | 
				
			||||||
#define MDCT_ARM_H
 | 
					#define MDCT_ARM_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "config.h"
 | 
					 | 
				
			||||||
#include "mdct.h"
 | 
					#include "mdct.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(HAVE_ARM_NE10)
 | 
					#if defined(HAVE_ARM_NE10)
 | 
				
			||||||
							
								
								
									
										160
									
								
								node_modules/@discordjs/opus/deps/opus/celt/arm/pitch_arm.h
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										160
									
								
								node_modules/@discordjs/opus/deps/opus/celt/arm/pitch_arm.h
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,160 @@
 | 
				
			|||||||
 | 
					/* Copyright (c) 2010 Xiph.Org Foundation
 | 
				
			||||||
 | 
					 * Copyright (c) 2013 Parrot */
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					   Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					   modification, are permitted provided that the following conditions
 | 
				
			||||||
 | 
					   are met:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   - Redistributions of source code must retain the above copyright
 | 
				
			||||||
 | 
					   notice, this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   - Redistributions in binary form must reproduce the above copyright
 | 
				
			||||||
 | 
					   notice, this list of conditions and the following disclaimer in the
 | 
				
			||||||
 | 
					   documentation and/or other materials provided with the distribution.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
				
			||||||
 | 
					   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
				
			||||||
 | 
					   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
				
			||||||
 | 
					   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
 | 
				
			||||||
 | 
					   OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 | 
				
			||||||
 | 
					   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 | 
				
			||||||
 | 
					   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 | 
				
			||||||
 | 
					   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 | 
				
			||||||
 | 
					   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 | 
				
			||||||
 | 
					   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 | 
				
			||||||
 | 
					   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if !defined(PITCH_ARM_H)
 | 
				
			||||||
 | 
					# define PITCH_ARM_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# include "armcpu.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# if defined(OPUS_ARM_MAY_HAVE_NEON_INTR)
 | 
				
			||||||
 | 
					opus_val32 celt_inner_prod_neon(const opus_val16 *x, const opus_val16 *y, int N);
 | 
				
			||||||
 | 
					void dual_inner_prod_neon(const opus_val16 *x, const opus_val16 *y01,
 | 
				
			||||||
 | 
					        const opus_val16 *y02, int N, opus_val32 *xy1, opus_val32 *xy2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  if !defined(OPUS_HAVE_RTCD) && defined(OPUS_ARM_PRESUME_NEON)
 | 
				
			||||||
 | 
					#   define OVERRIDE_CELT_INNER_PROD (1)
 | 
				
			||||||
 | 
					#   define OVERRIDE_DUAL_INNER_PROD (1)
 | 
				
			||||||
 | 
					#   define celt_inner_prod(x, y, N, arch) ((void)(arch), PRESUME_NEON(celt_inner_prod)(x, y, N))
 | 
				
			||||||
 | 
					#   define dual_inner_prod(x, y01, y02, N, xy1, xy2, arch) ((void)(arch), PRESUME_NEON(dual_inner_prod)(x, y01, y02, N, xy1, xy2))
 | 
				
			||||||
 | 
					#  endif
 | 
				
			||||||
 | 
					# endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# if !defined(OVERRIDE_CELT_INNER_PROD)
 | 
				
			||||||
 | 
					#  if defined(OPUS_HAVE_RTCD) && (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR))
 | 
				
			||||||
 | 
					extern opus_val32 (*const CELT_INNER_PROD_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *x, const opus_val16 *y, int N);
 | 
				
			||||||
 | 
					#   define OVERRIDE_CELT_INNER_PROD (1)
 | 
				
			||||||
 | 
					#   define celt_inner_prod(x, y, N, arch) ((*CELT_INNER_PROD_IMPL[(arch)&OPUS_ARCHMASK])(x, y, N))
 | 
				
			||||||
 | 
					#  elif defined(OPUS_ARM_PRESUME_NEON_INTR)
 | 
				
			||||||
 | 
					#   define OVERRIDE_CELT_INNER_PROD (1)
 | 
				
			||||||
 | 
					#   define celt_inner_prod(x, y, N, arch) ((void)(arch), celt_inner_prod_neon(x, y, N))
 | 
				
			||||||
 | 
					#  endif
 | 
				
			||||||
 | 
					# endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# if !defined(OVERRIDE_DUAL_INNER_PROD)
 | 
				
			||||||
 | 
					#  if defined(OPUS_HAVE_RTCD) && (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR))
 | 
				
			||||||
 | 
					extern void (*const DUAL_INNER_PROD_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *x,
 | 
				
			||||||
 | 
					        const opus_val16 *y01, const opus_val16 *y02, int N, opus_val32 *xy1, opus_val32 *xy2);
 | 
				
			||||||
 | 
					#   define OVERRIDE_DUAL_INNER_PROD (1)
 | 
				
			||||||
 | 
					#   define dual_inner_prod(x, y01, y02, N, xy1, xy2, arch) ((*DUAL_INNER_PROD_IMPL[(arch)&OPUS_ARCHMASK])(x, y01, y02, N, xy1, xy2))
 | 
				
			||||||
 | 
					#  elif defined(OPUS_ARM_PRESUME_NEON_INTR)
 | 
				
			||||||
 | 
					#   define OVERRIDE_DUAL_INNER_PROD (1)
 | 
				
			||||||
 | 
					#   define dual_inner_prod(x, y01, y02, N, xy1, xy2, arch) ((void)(arch), dual_inner_prod_neon(x, y01, y02, N, xy1, xy2))
 | 
				
			||||||
 | 
					#  endif
 | 
				
			||||||
 | 
					# endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# if defined(FIXED_POINT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  if defined(OPUS_ARM_MAY_HAVE_NEON)
 | 
				
			||||||
 | 
					opus_val32 celt_pitch_xcorr_neon(const opus_val16 *_x, const opus_val16 *_y,
 | 
				
			||||||
 | 
					    opus_val32 *xcorr, int len, int max_pitch, int arch);
 | 
				
			||||||
 | 
					#  endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  if defined(OPUS_ARM_MAY_HAVE_MEDIA)
 | 
				
			||||||
 | 
					#   define celt_pitch_xcorr_media MAY_HAVE_EDSP(celt_pitch_xcorr)
 | 
				
			||||||
 | 
					#  endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  if defined(OPUS_ARM_MAY_HAVE_EDSP)
 | 
				
			||||||
 | 
					opus_val32 celt_pitch_xcorr_edsp(const opus_val16 *_x, const opus_val16 *_y,
 | 
				
			||||||
 | 
					    opus_val32 *xcorr, int len, int max_pitch, int arch);
 | 
				
			||||||
 | 
					#  endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  if defined(OPUS_HAVE_RTCD) && \
 | 
				
			||||||
 | 
					    ((defined(OPUS_ARM_MAY_HAVE_NEON) && !defined(OPUS_ARM_PRESUME_NEON)) || \
 | 
				
			||||||
 | 
					     (defined(OPUS_ARM_MAY_HAVE_MEDIA) && !defined(OPUS_ARM_PRESUME_MEDIA)) || \
 | 
				
			||||||
 | 
					     (defined(OPUS_ARM_MAY_HAVE_EDSP) && !defined(OPUS_ARM_PRESUME_EDSP)))
 | 
				
			||||||
 | 
					extern opus_val32
 | 
				
			||||||
 | 
					(*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *,
 | 
				
			||||||
 | 
					      const opus_val16 *, opus_val32 *, int, int, int);
 | 
				
			||||||
 | 
					#   define OVERRIDE_PITCH_XCORR (1)
 | 
				
			||||||
 | 
					#   define celt_pitch_xcorr(_x, _y, xcorr, len, max_pitch, arch) \
 | 
				
			||||||
 | 
					  ((*CELT_PITCH_XCORR_IMPL[(arch)&OPUS_ARCHMASK])(_x, _y, \
 | 
				
			||||||
 | 
					        xcorr, len, max_pitch, arch))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  elif defined(OPUS_ARM_PRESUME_EDSP) || \
 | 
				
			||||||
 | 
					    defined(OPUS_ARM_PRESUME_MEDIA) || \
 | 
				
			||||||
 | 
					    defined(OPUS_ARM_PRESUME_NEON)
 | 
				
			||||||
 | 
					#   define OVERRIDE_PITCH_XCORR (1)
 | 
				
			||||||
 | 
					#   define celt_pitch_xcorr (PRESUME_NEON(celt_pitch_xcorr))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  if defined(OPUS_ARM_MAY_HAVE_NEON_INTR)
 | 
				
			||||||
 | 
					void xcorr_kernel_neon_fixed(
 | 
				
			||||||
 | 
					                    const opus_val16 *x,
 | 
				
			||||||
 | 
					                    const opus_val16 *y,
 | 
				
			||||||
 | 
					                    opus_val32       sum[4],
 | 
				
			||||||
 | 
					                    int              len);
 | 
				
			||||||
 | 
					#  endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  if defined(OPUS_HAVE_RTCD) && \
 | 
				
			||||||
 | 
					    (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern void (*const XCORR_KERNEL_IMPL[OPUS_ARCHMASK + 1])(
 | 
				
			||||||
 | 
					                    const opus_val16 *x,
 | 
				
			||||||
 | 
					                    const opus_val16 *y,
 | 
				
			||||||
 | 
					                    opus_val32       sum[4],
 | 
				
			||||||
 | 
					                    int              len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#   define OVERRIDE_XCORR_KERNEL (1)
 | 
				
			||||||
 | 
					#   define xcorr_kernel(x, y, sum, len, arch) \
 | 
				
			||||||
 | 
					     ((*XCORR_KERNEL_IMPL[(arch) & OPUS_ARCHMASK])(x, y, sum, len))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  elif defined(OPUS_ARM_PRESUME_NEON_INTR)
 | 
				
			||||||
 | 
					#   define OVERRIDE_XCORR_KERNEL (1)
 | 
				
			||||||
 | 
					#   define xcorr_kernel(x, y, sum, len, arch) \
 | 
				
			||||||
 | 
					      ((void)arch, xcorr_kernel_neon_fixed(x, y, sum, len))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#else /* Start !FIXED_POINT */
 | 
				
			||||||
 | 
					/* Float case */
 | 
				
			||||||
 | 
					#if defined(OPUS_ARM_MAY_HAVE_NEON_INTR)
 | 
				
			||||||
 | 
					void celt_pitch_xcorr_float_neon(const opus_val16 *_x, const opus_val16 *_y,
 | 
				
			||||||
 | 
					                                 opus_val32 *xcorr, int len, int max_pitch, int arch);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  if defined(OPUS_HAVE_RTCD) && \
 | 
				
			||||||
 | 
					    (defined(OPUS_ARM_MAY_HAVE_NEON_INTR) && !defined(OPUS_ARM_PRESUME_NEON_INTR))
 | 
				
			||||||
 | 
					extern void
 | 
				
			||||||
 | 
					(*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *,
 | 
				
			||||||
 | 
					      const opus_val16 *, opus_val32 *, int, int, int);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  define OVERRIDE_PITCH_XCORR (1)
 | 
				
			||||||
 | 
					#  define celt_pitch_xcorr(_x, _y, xcorr, len, max_pitch, arch) \
 | 
				
			||||||
 | 
					  ((*CELT_PITCH_XCORR_IMPL[(arch)&OPUS_ARCHMASK])(_x, _y, \
 | 
				
			||||||
 | 
					        xcorr, len, max_pitch, arch))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  elif defined(OPUS_ARM_PRESUME_NEON_INTR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#   define OVERRIDE_PITCH_XCORR (1)
 | 
				
			||||||
 | 
					#   define celt_pitch_xcorr celt_pitch_xcorr_float_neon
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#  endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* end !FIXED_POINT */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
							
								
								
									
										290
									
								
								node_modules/@discordjs/opus/deps/opus/celt/arm/pitch_neon_intr.c
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										290
									
								
								node_modules/@discordjs/opus/deps/opus/celt/arm/pitch_neon_intr.c
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,290 @@
 | 
				
			|||||||
 | 
					/***********************************************************************
 | 
				
			||||||
 | 
					Copyright (c) 2017 Google Inc.
 | 
				
			||||||
 | 
					Redistribution and use in source and binary forms, with or without
 | 
				
			||||||
 | 
					modification, are permitted provided that the following conditions
 | 
				
			||||||
 | 
					are met:
 | 
				
			||||||
 | 
					- Redistributions of source code must retain the above copyright notice,
 | 
				
			||||||
 | 
					this list of conditions and the following disclaimer.
 | 
				
			||||||
 | 
					- Redistributions in binary form must reproduce the above copyright
 | 
				
			||||||
 | 
					notice, this list of conditions and the following disclaimer in the
 | 
				
			||||||
 | 
					documentation and/or other materials provided with the distribution.
 | 
				
			||||||
 | 
					- Neither the name of Internet Society, IETF or IETF Trust, nor the
 | 
				
			||||||
 | 
					names of specific contributors, may be used to endorse or promote
 | 
				
			||||||
 | 
					products derived from this software without specific prior written
 | 
				
			||||||
 | 
					permission.
 | 
				
			||||||
 | 
					THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
				
			||||||
 | 
					AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 | 
				
			||||||
 | 
					IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | 
				
			||||||
 | 
					ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 | 
				
			||||||
 | 
					LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 | 
				
			||||||
 | 
					CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 | 
				
			||||||
 | 
					SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | 
				
			||||||
 | 
					INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 | 
				
			||||||
 | 
					CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 | 
				
			||||||
 | 
					ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 | 
				
			||||||
 | 
					POSSIBILITY OF SUCH DAMAGE.
 | 
				
			||||||
 | 
					***********************************************************************/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef HAVE_CONFIG_H
 | 
				
			||||||
 | 
					#include "config.h"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <arm_neon.h>
 | 
				
			||||||
 | 
					#include "pitch.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef FIXED_POINT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					opus_val32 celt_inner_prod_neon(const opus_val16 *x, const opus_val16 *y, int N)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int i;
 | 
				
			||||||
 | 
					    opus_val32 xy;
 | 
				
			||||||
 | 
					    int16x8_t x_s16x8, y_s16x8;
 | 
				
			||||||
 | 
					    int32x4_t xy_s32x4 = vdupq_n_s32(0);
 | 
				
			||||||
 | 
					    int64x2_t xy_s64x2;
 | 
				
			||||||
 | 
					    int64x1_t xy_s64x1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (i = 0; i < N - 7; i += 8) {
 | 
				
			||||||
 | 
					        x_s16x8  = vld1q_s16(&x[i]);
 | 
				
			||||||
 | 
					        y_s16x8  = vld1q_s16(&y[i]);
 | 
				
			||||||
 | 
					        xy_s32x4 = vmlal_s16(xy_s32x4, vget_low_s16 (x_s16x8), vget_low_s16 (y_s16x8));
 | 
				
			||||||
 | 
					        xy_s32x4 = vmlal_s16(xy_s32x4, vget_high_s16(x_s16x8), vget_high_s16(y_s16x8));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (N - i >= 4) {
 | 
				
			||||||
 | 
					        const int16x4_t x_s16x4 = vld1_s16(&x[i]);
 | 
				
			||||||
 | 
					        const int16x4_t y_s16x4 = vld1_s16(&y[i]);
 | 
				
			||||||
 | 
					        xy_s32x4 = vmlal_s16(xy_s32x4, x_s16x4, y_s16x4);
 | 
				
			||||||
 | 
					        i += 4;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    xy_s64x2 = vpaddlq_s32(xy_s32x4);
 | 
				
			||||||
 | 
					    xy_s64x1 = vadd_s64(vget_low_s64(xy_s64x2), vget_high_s64(xy_s64x2));
 | 
				
			||||||
 | 
					    xy       = vget_lane_s32(vreinterpret_s32_s64(xy_s64x1), 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (; i < N; i++) {
 | 
				
			||||||
 | 
					        xy = MAC16_16(xy, x[i], y[i]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef OPUS_CHECK_ASM
 | 
				
			||||||
 | 
					    celt_assert(celt_inner_prod_c(x, y, N) == xy);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return xy;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void dual_inner_prod_neon(const opus_val16 *x, const opus_val16 *y01, const opus_val16 *y02,
 | 
				
			||||||
 | 
					        int N, opus_val32 *xy1, opus_val32 *xy2)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int i;
 | 
				
			||||||
 | 
					    opus_val32 xy01, xy02;
 | 
				
			||||||
 | 
					    int16x8_t x_s16x8, y01_s16x8, y02_s16x8;
 | 
				
			||||||
 | 
					    int32x4_t xy01_s32x4 = vdupq_n_s32(0);
 | 
				
			||||||
 | 
					    int32x4_t xy02_s32x4 = vdupq_n_s32(0);
 | 
				
			||||||
 | 
					    int64x2_t xy01_s64x2, xy02_s64x2;
 | 
				
			||||||
 | 
					    int64x1_t xy01_s64x1, xy02_s64x1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (i = 0; i < N - 7; i += 8) {
 | 
				
			||||||
 | 
					        x_s16x8    = vld1q_s16(&x[i]);
 | 
				
			||||||
 | 
					        y01_s16x8  = vld1q_s16(&y01[i]);
 | 
				
			||||||
 | 
					        y02_s16x8  = vld1q_s16(&y02[i]);
 | 
				
			||||||
 | 
					        xy01_s32x4 = vmlal_s16(xy01_s32x4, vget_low_s16 (x_s16x8), vget_low_s16 (y01_s16x8));
 | 
				
			||||||
 | 
					        xy02_s32x4 = vmlal_s16(xy02_s32x4, vget_low_s16 (x_s16x8), vget_low_s16 (y02_s16x8));
 | 
				
			||||||
 | 
					        xy01_s32x4 = vmlal_s16(xy01_s32x4, vget_high_s16(x_s16x8), vget_high_s16(y01_s16x8));
 | 
				
			||||||
 | 
					        xy02_s32x4 = vmlal_s16(xy02_s32x4, vget_high_s16(x_s16x8), vget_high_s16(y02_s16x8));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (N - i >= 4) {
 | 
				
			||||||
 | 
					        const int16x4_t x_s16x4   = vld1_s16(&x[i]);
 | 
				
			||||||
 | 
					        const int16x4_t y01_s16x4 = vld1_s16(&y01[i]);
 | 
				
			||||||
 | 
					        const int16x4_t y02_s16x4 = vld1_s16(&y02[i]);
 | 
				
			||||||
 | 
					        xy01_s32x4 = vmlal_s16(xy01_s32x4, x_s16x4, y01_s16x4);
 | 
				
			||||||
 | 
					        xy02_s32x4 = vmlal_s16(xy02_s32x4, x_s16x4, y02_s16x4);
 | 
				
			||||||
 | 
					        i += 4;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    xy01_s64x2 = vpaddlq_s32(xy01_s32x4);
 | 
				
			||||||
 | 
					    xy02_s64x2 = vpaddlq_s32(xy02_s32x4);
 | 
				
			||||||
 | 
					    xy01_s64x1 = vadd_s64(vget_low_s64(xy01_s64x2), vget_high_s64(xy01_s64x2));
 | 
				
			||||||
 | 
					    xy02_s64x1 = vadd_s64(vget_low_s64(xy02_s64x2), vget_high_s64(xy02_s64x2));
 | 
				
			||||||
 | 
					    xy01       = vget_lane_s32(vreinterpret_s32_s64(xy01_s64x1), 0);
 | 
				
			||||||
 | 
					    xy02       = vget_lane_s32(vreinterpret_s32_s64(xy02_s64x1), 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (; i < N; i++) {
 | 
				
			||||||
 | 
					        xy01 = MAC16_16(xy01, x[i], y01[i]);
 | 
				
			||||||
 | 
					        xy02 = MAC16_16(xy02, x[i], y02[i]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    *xy1 = xy01;
 | 
				
			||||||
 | 
					    *xy2 = xy02;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef OPUS_CHECK_ASM
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        opus_val32 xy1_c, xy2_c;
 | 
				
			||||||
 | 
					        dual_inner_prod_c(x, y01, y02, N, &xy1_c, &xy2_c);
 | 
				
			||||||
 | 
					        celt_assert(xy1_c == *xy1);
 | 
				
			||||||
 | 
					        celt_assert(xy2_c == *xy2);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#else /* !FIXED_POINT */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ========================================================================== */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef OPUS_CHECK_ASM
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* This part of code simulates floating-point NEON operations. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* celt_inner_prod_neon_float_c_simulation() simulates the floating-point   */
 | 
				
			||||||
 | 
					/* operations of celt_inner_prod_neon(), and both functions should have bit */
 | 
				
			||||||
 | 
					/* exact output.                                                            */
 | 
				
			||||||
 | 
					static opus_val32 celt_inner_prod_neon_float_c_simulation(const opus_val16 *x, const opus_val16 *y, int N)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   int i;
 | 
				
			||||||
 | 
					   opus_val32 xy, xy0 = 0, xy1 = 0, xy2 = 0, xy3 = 0;
 | 
				
			||||||
 | 
					   for (i = 0; i < N - 3; i += 4) {
 | 
				
			||||||
 | 
					      xy0 = MAC16_16(xy0, x[i + 0], y[i + 0]);
 | 
				
			||||||
 | 
					      xy1 = MAC16_16(xy1, x[i + 1], y[i + 1]);
 | 
				
			||||||
 | 
					      xy2 = MAC16_16(xy2, x[i + 2], y[i + 2]);
 | 
				
			||||||
 | 
					      xy3 = MAC16_16(xy3, x[i + 3], y[i + 3]);
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					   xy0 += xy2;
 | 
				
			||||||
 | 
					   xy1 += xy3;
 | 
				
			||||||
 | 
					   xy = xy0 + xy1;
 | 
				
			||||||
 | 
					   for (; i < N; i++) {
 | 
				
			||||||
 | 
					      xy = MAC16_16(xy, x[i], y[i]);
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					   return xy;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* dual_inner_prod_neon_float_c_simulation() simulates the floating-point   */
 | 
				
			||||||
 | 
					/* operations of dual_inner_prod_neon(), and both functions should have bit */
 | 
				
			||||||
 | 
					/* exact output.                                                            */
 | 
				
			||||||
 | 
					static void dual_inner_prod_neon_float_c_simulation(const opus_val16 *x, const opus_val16 *y01, const opus_val16 *y02,
 | 
				
			||||||
 | 
					      int N, opus_val32 *xy1, opus_val32 *xy2)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   int i;
 | 
				
			||||||
 | 
					   opus_val32 xy01, xy02, xy01_0 = 0, xy01_1 = 0, xy01_2 = 0, xy01_3 = 0, xy02_0 = 0, xy02_1 = 0, xy02_2 = 0, xy02_3 = 0;
 | 
				
			||||||
 | 
					   for (i = 0; i < N - 3; i += 4) {
 | 
				
			||||||
 | 
					      xy01_0 = MAC16_16(xy01_0, x[i + 0], y01[i + 0]);
 | 
				
			||||||
 | 
					      xy01_1 = MAC16_16(xy01_1, x[i + 1], y01[i + 1]);
 | 
				
			||||||
 | 
					      xy01_2 = MAC16_16(xy01_2, x[i + 2], y01[i + 2]);
 | 
				
			||||||
 | 
					      xy01_3 = MAC16_16(xy01_3, x[i + 3], y01[i + 3]);
 | 
				
			||||||
 | 
					      xy02_0 = MAC16_16(xy02_0, x[i + 0], y02[i + 0]);
 | 
				
			||||||
 | 
					      xy02_1 = MAC16_16(xy02_1, x[i + 1], y02[i + 1]);
 | 
				
			||||||
 | 
					      xy02_2 = MAC16_16(xy02_2, x[i + 2], y02[i + 2]);
 | 
				
			||||||
 | 
					      xy02_3 = MAC16_16(xy02_3, x[i + 3], y02[i + 3]);
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					   xy01_0 += xy01_2;
 | 
				
			||||||
 | 
					   xy02_0 += xy02_2;
 | 
				
			||||||
 | 
					   xy01_1 += xy01_3;
 | 
				
			||||||
 | 
					   xy02_1 += xy02_3;
 | 
				
			||||||
 | 
					   xy01 = xy01_0 + xy01_1;
 | 
				
			||||||
 | 
					   xy02 = xy02_0 + xy02_1;
 | 
				
			||||||
 | 
					   for (; i < N; i++) {
 | 
				
			||||||
 | 
					      xy01 = MAC16_16(xy01, x[i], y01[i]);
 | 
				
			||||||
 | 
					      xy02 = MAC16_16(xy02, x[i], y02[i]);
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					   *xy1 = xy01;
 | 
				
			||||||
 | 
					   *xy2 = xy02;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* OPUS_CHECK_ASM */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ========================================================================== */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					opus_val32 celt_inner_prod_neon(const opus_val16 *x, const opus_val16 *y, int N)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int i;
 | 
				
			||||||
 | 
					    opus_val32 xy;
 | 
				
			||||||
 | 
					    float32x4_t xy_f32x4 = vdupq_n_f32(0);
 | 
				
			||||||
 | 
					    float32x2_t xy_f32x2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (i = 0; i < N - 7; i += 8) {
 | 
				
			||||||
 | 
					        float32x4_t x_f32x4, y_f32x4;
 | 
				
			||||||
 | 
					        x_f32x4  = vld1q_f32(&x[i]);
 | 
				
			||||||
 | 
					        y_f32x4  = vld1q_f32(&y[i]);
 | 
				
			||||||
 | 
					        xy_f32x4 = vmlaq_f32(xy_f32x4, x_f32x4, y_f32x4);
 | 
				
			||||||
 | 
					        x_f32x4  = vld1q_f32(&x[i + 4]);
 | 
				
			||||||
 | 
					        y_f32x4  = vld1q_f32(&y[i + 4]);
 | 
				
			||||||
 | 
					        xy_f32x4 = vmlaq_f32(xy_f32x4, x_f32x4, y_f32x4);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (N - i >= 4) {
 | 
				
			||||||
 | 
					        const float32x4_t x_f32x4 = vld1q_f32(&x[i]);
 | 
				
			||||||
 | 
					        const float32x4_t y_f32x4 = vld1q_f32(&y[i]);
 | 
				
			||||||
 | 
					        xy_f32x4 = vmlaq_f32(xy_f32x4, x_f32x4, y_f32x4);
 | 
				
			||||||
 | 
					        i += 4;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    xy_f32x2 = vadd_f32(vget_low_f32(xy_f32x4), vget_high_f32(xy_f32x4));
 | 
				
			||||||
 | 
					    xy_f32x2 = vpadd_f32(xy_f32x2, xy_f32x2);
 | 
				
			||||||
 | 
					    xy       = vget_lane_f32(xy_f32x2, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (; i < N; i++) {
 | 
				
			||||||
 | 
					        xy = MAC16_16(xy, x[i], y[i]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef OPUS_CHECK_ASM
 | 
				
			||||||
 | 
					    celt_assert(ABS32(celt_inner_prod_neon_float_c_simulation(x, y, N) - xy) <= VERY_SMALL);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return xy;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void dual_inner_prod_neon(const opus_val16 *x, const opus_val16 *y01, const opus_val16 *y02,
 | 
				
			||||||
 | 
					        int N, opus_val32 *xy1, opus_val32 *xy2)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int i;
 | 
				
			||||||
 | 
					    opus_val32 xy01, xy02;
 | 
				
			||||||
 | 
					    float32x4_t xy01_f32x4 = vdupq_n_f32(0);
 | 
				
			||||||
 | 
					    float32x4_t xy02_f32x4 = vdupq_n_f32(0);
 | 
				
			||||||
 | 
					    float32x2_t xy01_f32x2, xy02_f32x2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (i = 0; i < N - 7; i += 8) {
 | 
				
			||||||
 | 
					        float32x4_t x_f32x4, y01_f32x4, y02_f32x4;
 | 
				
			||||||
 | 
					        x_f32x4    = vld1q_f32(&x[i]);
 | 
				
			||||||
 | 
					        y01_f32x4  = vld1q_f32(&y01[i]);
 | 
				
			||||||
 | 
					        y02_f32x4  = vld1q_f32(&y02[i]);
 | 
				
			||||||
 | 
					        xy01_f32x4 = vmlaq_f32(xy01_f32x4, x_f32x4, y01_f32x4);
 | 
				
			||||||
 | 
					        xy02_f32x4 = vmlaq_f32(xy02_f32x4, x_f32x4, y02_f32x4);
 | 
				
			||||||
 | 
					        x_f32x4    = vld1q_f32(&x[i + 4]);
 | 
				
			||||||
 | 
					        y01_f32x4  = vld1q_f32(&y01[i + 4]);
 | 
				
			||||||
 | 
					        y02_f32x4  = vld1q_f32(&y02[i + 4]);
 | 
				
			||||||
 | 
					        xy01_f32x4 = vmlaq_f32(xy01_f32x4, x_f32x4, y01_f32x4);
 | 
				
			||||||
 | 
					        xy02_f32x4 = vmlaq_f32(xy02_f32x4, x_f32x4, y02_f32x4);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (N - i >= 4) {
 | 
				
			||||||
 | 
					        const float32x4_t x_f32x4   = vld1q_f32(&x[i]);
 | 
				
			||||||
 | 
					        const float32x4_t y01_f32x4 = vld1q_f32(&y01[i]);
 | 
				
			||||||
 | 
					        const float32x4_t y02_f32x4 = vld1q_f32(&y02[i]);
 | 
				
			||||||
 | 
					        xy01_f32x4 = vmlaq_f32(xy01_f32x4, x_f32x4, y01_f32x4);
 | 
				
			||||||
 | 
					        xy02_f32x4 = vmlaq_f32(xy02_f32x4, x_f32x4, y02_f32x4);
 | 
				
			||||||
 | 
					        i += 4;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    xy01_f32x2 = vadd_f32(vget_low_f32(xy01_f32x4), vget_high_f32(xy01_f32x4));
 | 
				
			||||||
 | 
					    xy02_f32x2 = vadd_f32(vget_low_f32(xy02_f32x4), vget_high_f32(xy02_f32x4));
 | 
				
			||||||
 | 
					    xy01_f32x2 = vpadd_f32(xy01_f32x2, xy01_f32x2);
 | 
				
			||||||
 | 
					    xy02_f32x2 = vpadd_f32(xy02_f32x2, xy02_f32x2);
 | 
				
			||||||
 | 
					    xy01       = vget_lane_f32(xy01_f32x2, 0);
 | 
				
			||||||
 | 
					    xy02       = vget_lane_f32(xy02_f32x2, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (; i < N; i++) {
 | 
				
			||||||
 | 
					        xy01 = MAC16_16(xy01, x[i], y01[i]);
 | 
				
			||||||
 | 
					        xy02 = MAC16_16(xy02, x[i], y02[i]);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    *xy1 = xy01;
 | 
				
			||||||
 | 
					    *xy2 = xy02;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef OPUS_CHECK_ASM
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        opus_val32 xy1_c, xy2_c;
 | 
				
			||||||
 | 
					        dual_inner_prod_neon_float_c_simulation(x, y01, y02, N, &xy1_c, &xy2_c);
 | 
				
			||||||
 | 
					        celt_assert(ABS32(xy1_c - *xy1) <= VERY_SMALL);
 | 
				
			||||||
 | 
					        celt_assert(ABS32(xy2_c - *xy2) <= VERY_SMALL);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* FIXED_POINT */
 | 
				
			||||||
@@ -65,19 +65,19 @@ opus_uint32 celt_lcg_rand(opus_uint32 seed)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/* This is a cos() approximation designed to be bit-exact on any platform. Bit exactness
 | 
					/* This is a cos() approximation designed to be bit-exact on any platform. Bit exactness
 | 
				
			||||||
   with this approximation is important because it has an impact on the bit allocation */
 | 
					   with this approximation is important because it has an impact on the bit allocation */
 | 
				
			||||||
static opus_int16 bitexact_cos(opus_int16 x)
 | 
					opus_int16 bitexact_cos(opus_int16 x)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   opus_int32 tmp;
 | 
					   opus_int32 tmp;
 | 
				
			||||||
   opus_int16 x2;
 | 
					   opus_int16 x2;
 | 
				
			||||||
   tmp = (4096+((opus_int32)(x)*(x)))>>13;
 | 
					   tmp = (4096+((opus_int32)(x)*(x)))>>13;
 | 
				
			||||||
   celt_assert(tmp<=32767);
 | 
					   celt_sig_assert(tmp<=32767);
 | 
				
			||||||
   x2 = tmp;
 | 
					   x2 = tmp;
 | 
				
			||||||
   x2 = (32767-x2) + FRAC_MUL16(x2, (-7651 + FRAC_MUL16(x2, (8277 + FRAC_MUL16(-626, x2)))));
 | 
					   x2 = (32767-x2) + FRAC_MUL16(x2, (-7651 + FRAC_MUL16(x2, (8277 + FRAC_MUL16(-626, x2)))));
 | 
				
			||||||
   celt_assert(x2<=32766);
 | 
					   celt_sig_assert(x2<=32766);
 | 
				
			||||||
   return 1+x2;
 | 
					   return 1+x2;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int bitexact_log2tan(int isin,int icos)
 | 
					int bitexact_log2tan(int isin,int icos)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   int lc;
 | 
					   int lc;
 | 
				
			||||||
   int ls;
 | 
					   int ls;
 | 
				
			||||||
@@ -92,10 +92,11 @@ static int bitexact_log2tan(int isin,int icos)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#ifdef FIXED_POINT
 | 
					#ifdef FIXED_POINT
 | 
				
			||||||
/* Compute the amplitude (sqrt energy) in each of the bands */
 | 
					/* Compute the amplitude (sqrt energy) in each of the bands */
 | 
				
			||||||
void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int LM)
 | 
					void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int LM, int arch)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   int i, c, N;
 | 
					   int i, c, N;
 | 
				
			||||||
   const opus_int16 *eBands = m->eBands;
 | 
					   const opus_int16 *eBands = m->eBands;
 | 
				
			||||||
 | 
					   (void)arch;
 | 
				
			||||||
   N = m->shortMdctSize<<LM;
 | 
					   N = m->shortMdctSize<<LM;
 | 
				
			||||||
   c=0; do {
 | 
					   c=0; do {
 | 
				
			||||||
      for (i=0;i<end;i++)
 | 
					      for (i=0;i<end;i++)
 | 
				
			||||||
@@ -155,7 +156,7 @@ void normalise_bands(const CELTMode *m, const celt_sig * OPUS_RESTRICT freq, cel
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#else /* FIXED_POINT */
 | 
					#else /* FIXED_POINT */
 | 
				
			||||||
/* Compute the amplitude (sqrt energy) in each of the bands */
 | 
					/* Compute the amplitude (sqrt energy) in each of the bands */
 | 
				
			||||||
void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int LM)
 | 
					void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int LM, int arch)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   int i, c, N;
 | 
					   int i, c, N;
 | 
				
			||||||
   const opus_int16 *eBands = m->eBands;
 | 
					   const opus_int16 *eBands = m->eBands;
 | 
				
			||||||
@@ -164,7 +165,7 @@ void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *band
 | 
				
			|||||||
      for (i=0;i<end;i++)
 | 
					      for (i=0;i<end;i++)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
         opus_val32 sum;
 | 
					         opus_val32 sum;
 | 
				
			||||||
         sum = 1e-27f + celt_inner_prod_c(&X[c*N+(eBands[i]<<LM)], &X[c*N+(eBands[i]<<LM)], (eBands[i+1]-eBands[i])<<LM);
 | 
					         sum = 1e-27f + celt_inner_prod(&X[c*N+(eBands[i]<<LM)], &X[c*N+(eBands[i]<<LM)], (eBands[i+1]-eBands[i])<<LM, arch);
 | 
				
			||||||
         bandE[i+c*m->nbEBands] = celt_sqrt(sum);
 | 
					         bandE[i+c*m->nbEBands] = celt_sqrt(sum);
 | 
				
			||||||
         /*printf ("%f ", bandE[i+c*m->nbEBands]);*/
 | 
					         /*printf ("%f ", bandE[i+c*m->nbEBands]);*/
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -224,9 +225,9 @@ void denormalise_bands(const CELTMode *m, const celt_norm * OPUS_RESTRICT X,
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
      j=M*eBands[i];
 | 
					      j=M*eBands[i];
 | 
				
			||||||
      band_end = M*eBands[i+1];
 | 
					      band_end = M*eBands[i+1];
 | 
				
			||||||
      lg = ADD16(bandLogE[i], SHL16((opus_val16)eMeans[i],6));
 | 
					      lg = SATURATE16(ADD32(bandLogE[i], SHL32((opus_val32)eMeans[i],6)));
 | 
				
			||||||
#ifndef FIXED_POINT
 | 
					#ifndef FIXED_POINT
 | 
				
			||||||
      g = celt_exp2(lg);
 | 
					      g = celt_exp2(MIN32(32.f, lg));
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
      /* Handle the integer part of the log energy */
 | 
					      /* Handle the integer part of the log energy */
 | 
				
			||||||
      shift = 16-(lg>>DB_SHIFT);
 | 
					      shift = 16-(lg>>DB_SHIFT);
 | 
				
			||||||
@@ -241,12 +242,12 @@ void denormalise_bands(const CELTMode *m, const celt_norm * OPUS_RESTRICT X,
 | 
				
			|||||||
      /* Handle extreme gains with negative shift. */
 | 
					      /* Handle extreme gains with negative shift. */
 | 
				
			||||||
      if (shift<0)
 | 
					      if (shift<0)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
         /* For shift < -2 we'd be likely to overflow, so we're capping
 | 
					         /* For shift <= -2 and g > 16384 we'd be likely to overflow, so we're
 | 
				
			||||||
               the gain here. This shouldn't happen unless the bitstream is
 | 
					            capping the gain here, which is equivalent to a cap of 18 on lg.
 | 
				
			||||||
               already corrupted. */
 | 
					            This shouldn't trigger unless the bitstream is already corrupted. */
 | 
				
			||||||
         if (shift < -2)
 | 
					         if (shift <= -2)
 | 
				
			||||||
         {
 | 
					         {
 | 
				
			||||||
            g = 32767;
 | 
					            g = 16384;
 | 
				
			||||||
            shift = -2;
 | 
					            shift = -2;
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
         do {
 | 
					         do {
 | 
				
			||||||
@@ -281,7 +282,7 @@ void anti_collapse(const CELTMode *m, celt_norm *X_, unsigned char *collapse_mas
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      N0 = m->eBands[i+1]-m->eBands[i];
 | 
					      N0 = m->eBands[i+1]-m->eBands[i];
 | 
				
			||||||
      /* depth in 1/8 bits */
 | 
					      /* depth in 1/8 bits */
 | 
				
			||||||
      celt_assert(pulses[i]>=0);
 | 
					      celt_sig_assert(pulses[i]>=0);
 | 
				
			||||||
      depth = celt_udiv(1+pulses[i], (m->eBands[i+1]-m->eBands[i]))>>LM;
 | 
					      depth = celt_udiv(1+pulses[i], (m->eBands[i+1]-m->eBands[i]))>>LM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef FIXED_POINT
 | 
					#ifdef FIXED_POINT
 | 
				
			||||||
@@ -360,6 +361,30 @@ void anti_collapse(const CELTMode *m, celt_norm *X_, unsigned char *collapse_mas
 | 
				
			|||||||
   }
 | 
					   }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Compute the weights to use for optimizing normalized distortion across
 | 
				
			||||||
 | 
					   channels. We use the amplitude to weight square distortion, which means
 | 
				
			||||||
 | 
					   that we use the square root of the value we would have been using if we
 | 
				
			||||||
 | 
					   wanted to minimize the MSE in the non-normalized domain. This roughly
 | 
				
			||||||
 | 
					   corresponds to some quick-and-dirty perceptual experiments I ran to
 | 
				
			||||||
 | 
					   measure inter-aural masking (there doesn't seem to be any published data
 | 
				
			||||||
 | 
					   on the topic). */
 | 
				
			||||||
 | 
					static void compute_channel_weights(celt_ener Ex, celt_ener Ey, opus_val16 w[2])
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   celt_ener minE;
 | 
				
			||||||
 | 
					#ifdef FIXED_POINT
 | 
				
			||||||
 | 
					   int shift;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					   minE = MIN32(Ex, Ey);
 | 
				
			||||||
 | 
					   /* Adjustment to make the weights a bit more conservative. */
 | 
				
			||||||
 | 
					   Ex = ADD32(Ex, minE/3);
 | 
				
			||||||
 | 
					   Ey = ADD32(Ey, minE/3);
 | 
				
			||||||
 | 
					#ifdef FIXED_POINT
 | 
				
			||||||
 | 
					   shift = celt_ilog2(EPSILON+MAX32(Ex, Ey))-14;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					   w[0] = VSHR32(Ex, shift);
 | 
				
			||||||
 | 
					   w[1] = VSHR32(Ey, shift);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void intensity_stereo(const CELTMode *m, celt_norm * OPUS_RESTRICT X, const celt_norm * OPUS_RESTRICT Y, const celt_ener *bandE, int bandID, int N)
 | 
					static void intensity_stereo(const CELTMode *m, celt_norm * OPUS_RESTRICT X, const celt_norm * OPUS_RESTRICT Y, const celt_ener *bandE, int bandID, int N)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   int i = bandID;
 | 
					   int i = bandID;
 | 
				
			||||||
@@ -414,7 +439,7 @@ static void stereo_merge(celt_norm * OPUS_RESTRICT X, celt_norm * OPUS_RESTRICT
 | 
				
			|||||||
   /* Compensating for the mid normalization */
 | 
					   /* Compensating for the mid normalization */
 | 
				
			||||||
   xp = MULT16_32_Q15(mid, xp);
 | 
					   xp = MULT16_32_Q15(mid, xp);
 | 
				
			||||||
   /* mid and side are in Q15, not Q14 like X and Y */
 | 
					   /* mid and side are in Q15, not Q14 like X and Y */
 | 
				
			||||||
   mid2 = SHR32(mid, 1);
 | 
					   mid2 = SHR16(mid, 1);
 | 
				
			||||||
   El = MULT16_16(mid2, mid2) + side - 2*xp;
 | 
					   El = MULT16_16(mid2, mid2) + side - 2*xp;
 | 
				
			||||||
   Er = MULT16_16(mid2, mid2) + side + 2*xp;
 | 
					   Er = MULT16_16(mid2, mid2) + side + 2*xp;
 | 
				
			||||||
   if (Er < QCONST32(6e-4f, 28) || El < QCONST32(6e-4f, 28))
 | 
					   if (Er < QCONST32(6e-4f, 28) || El < QCONST32(6e-4f, 28))
 | 
				
			||||||
@@ -453,7 +478,7 @@ static void stereo_merge(celt_norm * OPUS_RESTRICT X, celt_norm * OPUS_RESTRICT
 | 
				
			|||||||
/* Decide whether we should spread the pulses in the current frame */
 | 
					/* Decide whether we should spread the pulses in the current frame */
 | 
				
			||||||
int spreading_decision(const CELTMode *m, const celt_norm *X, int *average,
 | 
					int spreading_decision(const CELTMode *m, const celt_norm *X, int *average,
 | 
				
			||||||
      int last_decision, int *hf_average, int *tapset_decision, int update_hf,
 | 
					      int last_decision, int *hf_average, int *tapset_decision, int update_hf,
 | 
				
			||||||
      int end, int C, int M)
 | 
					      int end, int C, int M, const int *spread_weight)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   int i, c, N0;
 | 
					   int i, c, N0;
 | 
				
			||||||
   int sum = 0, nbBands=0;
 | 
					   int sum = 0, nbBands=0;
 | 
				
			||||||
@@ -494,8 +519,8 @@ int spreading_decision(const CELTMode *m, const celt_norm *X, int *average,
 | 
				
			|||||||
         if (i>m->nbEBands-4)
 | 
					         if (i>m->nbEBands-4)
 | 
				
			||||||
            hf_sum += celt_udiv(32*(tcount[1]+tcount[0]), N);
 | 
					            hf_sum += celt_udiv(32*(tcount[1]+tcount[0]), N);
 | 
				
			||||||
         tmp = (2*tcount[2] >= N) + (2*tcount[1] >= N) + (2*tcount[0] >= N);
 | 
					         tmp = (2*tcount[2] >= N) + (2*tcount[1] >= N) + (2*tcount[0] >= N);
 | 
				
			||||||
         sum += tmp*256;
 | 
					         sum += tmp*spread_weight[i];
 | 
				
			||||||
         nbBands++;
 | 
					         nbBands+=spread_weight[i];
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
   } while (++c<C);
 | 
					   } while (++c<C);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -519,7 +544,7 @@ int spreading_decision(const CELTMode *m, const celt_norm *X, int *average,
 | 
				
			|||||||
   /*printf("%d %d %d\n", hf_sum, *hf_average, *tapset_decision);*/
 | 
					   /*printf("%d %d %d\n", hf_sum, *hf_average, *tapset_decision);*/
 | 
				
			||||||
   celt_assert(nbBands>0); /* end has to be non-zero */
 | 
					   celt_assert(nbBands>0); /* end has to be non-zero */
 | 
				
			||||||
   celt_assert(sum>=0);
 | 
					   celt_assert(sum>=0);
 | 
				
			||||||
   sum = celt_udiv(sum, nbBands);
 | 
					   sum = celt_udiv((opus_int32)sum<<8, nbBands);
 | 
				
			||||||
   /* Recursive averaging */
 | 
					   /* Recursive averaging */
 | 
				
			||||||
   sum = (sum+*average)>>1;
 | 
					   sum = (sum+*average)>>1;
 | 
				
			||||||
   *average = sum;
 | 
					   *average = sum;
 | 
				
			||||||
@@ -647,6 +672,7 @@ static int compute_qn(int N, int b, int offset, int pulse_cap, int stereo)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
struct band_ctx {
 | 
					struct band_ctx {
 | 
				
			||||||
   int encode;
 | 
					   int encode;
 | 
				
			||||||
 | 
					   int resynth;
 | 
				
			||||||
   const CELTMode *m;
 | 
					   const CELTMode *m;
 | 
				
			||||||
   int i;
 | 
					   int i;
 | 
				
			||||||
   int intensity;
 | 
					   int intensity;
 | 
				
			||||||
@@ -657,6 +683,9 @@ struct band_ctx {
 | 
				
			|||||||
   const celt_ener *bandE;
 | 
					   const celt_ener *bandE;
 | 
				
			||||||
   opus_uint32 seed;
 | 
					   opus_uint32 seed;
 | 
				
			||||||
   int arch;
 | 
					   int arch;
 | 
				
			||||||
 | 
					   int theta_round;
 | 
				
			||||||
 | 
					   int disable_inv;
 | 
				
			||||||
 | 
					   int avoid_split_noise;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct split_ctx {
 | 
					struct split_ctx {
 | 
				
			||||||
@@ -714,8 +743,35 @@ static void compute_theta(struct band_ctx *ctx, struct split_ctx *sctx,
 | 
				
			|||||||
   if (qn!=1)
 | 
					   if (qn!=1)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
      if (encode)
 | 
					      if (encode)
 | 
				
			||||||
         itheta = (itheta*qn+8192)>>14;
 | 
					      {
 | 
				
			||||||
 | 
					         if (!stereo || ctx->theta_round == 0)
 | 
				
			||||||
 | 
					         {
 | 
				
			||||||
 | 
					            itheta = (itheta*(opus_int32)qn+8192)>>14;
 | 
				
			||||||
 | 
					            if (!stereo && ctx->avoid_split_noise && itheta > 0 && itheta < qn)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					               /* Check if the selected value of theta will cause the bit allocation
 | 
				
			||||||
 | 
					                  to inject noise on one side. If so, make sure the energy of that side
 | 
				
			||||||
 | 
					                  is zero. */
 | 
				
			||||||
 | 
					               int unquantized = celt_udiv((opus_int32)itheta*16384, qn);
 | 
				
			||||||
 | 
					               imid = bitexact_cos((opus_int16)unquantized);
 | 
				
			||||||
 | 
					               iside = bitexact_cos((opus_int16)(16384-unquantized));
 | 
				
			||||||
 | 
					               delta = FRAC_MUL16((N-1)<<7,bitexact_log2tan(iside,imid));
 | 
				
			||||||
 | 
					               if (delta > *b)
 | 
				
			||||||
 | 
					                  itheta = qn;
 | 
				
			||||||
 | 
					               else if (delta < -*b)
 | 
				
			||||||
 | 
					                  itheta = 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					         } else {
 | 
				
			||||||
 | 
					            int down;
 | 
				
			||||||
 | 
					            /* Bias quantization towards itheta=0 and itheta=16384. */
 | 
				
			||||||
 | 
					            int bias = itheta > 8192 ? 32767/qn : -32767/qn;
 | 
				
			||||||
 | 
					            down = IMIN(qn-1, IMAX(0, (itheta*(opus_int32)qn + bias)>>14));
 | 
				
			||||||
 | 
					            if (ctx->theta_round < 0)
 | 
				
			||||||
 | 
					               itheta = down;
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					               itheta = down+1;
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
      /* Entropy coding of the angle. We use a uniform pdf for the
 | 
					      /* Entropy coding of the angle. We use a uniform pdf for the
 | 
				
			||||||
         time split, a step for stereo, and a triangular one for the rest. */
 | 
					         time split, a step for stereo, and a triangular one for the rest. */
 | 
				
			||||||
      if (stereo && N>2)
 | 
					      if (stereo && N>2)
 | 
				
			||||||
@@ -793,7 +849,7 @@ static void compute_theta(struct band_ctx *ctx, struct split_ctx *sctx,
 | 
				
			|||||||
   } else if (stereo) {
 | 
					   } else if (stereo) {
 | 
				
			||||||
      if (encode)
 | 
					      if (encode)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
         inv = itheta > 8192;
 | 
					         inv = itheta > 8192 && !ctx->disable_inv;
 | 
				
			||||||
         if (inv)
 | 
					         if (inv)
 | 
				
			||||||
         {
 | 
					         {
 | 
				
			||||||
            int j;
 | 
					            int j;
 | 
				
			||||||
@@ -810,6 +866,9 @@ static void compute_theta(struct band_ctx *ctx, struct split_ctx *sctx,
 | 
				
			|||||||
            inv = ec_dec_bit_logp(ec, 2);
 | 
					            inv = ec_dec_bit_logp(ec, 2);
 | 
				
			||||||
      } else
 | 
					      } else
 | 
				
			||||||
         inv = 0;
 | 
					         inv = 0;
 | 
				
			||||||
 | 
					      /* inv flag override to avoid problems with downmixing. */
 | 
				
			||||||
 | 
					      if (ctx->disable_inv)
 | 
				
			||||||
 | 
					         inv = 0;
 | 
				
			||||||
      itheta = 0;
 | 
					      itheta = 0;
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
   qalloc = ec_tell_frac(ec) - tell;
 | 
					   qalloc = ec_tell_frac(ec) - tell;
 | 
				
			||||||
@@ -845,11 +904,6 @@ static void compute_theta(struct band_ctx *ctx, struct split_ctx *sctx,
 | 
				
			|||||||
static unsigned quant_band_n1(struct band_ctx *ctx, celt_norm *X, celt_norm *Y, int b,
 | 
					static unsigned quant_band_n1(struct band_ctx *ctx, celt_norm *X, celt_norm *Y, int b,
 | 
				
			||||||
      celt_norm *lowband_out)
 | 
					      celt_norm *lowband_out)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef RESYNTH
 | 
					 | 
				
			||||||
   int resynth = 1;
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
   int resynth = !ctx->encode;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
   int c;
 | 
					   int c;
 | 
				
			||||||
   int stereo;
 | 
					   int stereo;
 | 
				
			||||||
   celt_norm *x = X;
 | 
					   celt_norm *x = X;
 | 
				
			||||||
@@ -874,7 +928,7 @@ static unsigned quant_band_n1(struct band_ctx *ctx, celt_norm *X, celt_norm *Y,
 | 
				
			|||||||
         ctx->remaining_bits -= 1<<BITRES;
 | 
					         ctx->remaining_bits -= 1<<BITRES;
 | 
				
			||||||
         b-=1<<BITRES;
 | 
					         b-=1<<BITRES;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      if (resynth)
 | 
					      if (ctx->resynth)
 | 
				
			||||||
         x[0] = sign ? -NORM_SCALING : NORM_SCALING;
 | 
					         x[0] = sign ? -NORM_SCALING : NORM_SCALING;
 | 
				
			||||||
      x = Y;
 | 
					      x = Y;
 | 
				
			||||||
   } while (++c<1+stereo);
 | 
					   } while (++c<1+stereo);
 | 
				
			||||||
@@ -899,11 +953,6 @@ static unsigned quant_partition(struct band_ctx *ctx, celt_norm *X,
 | 
				
			|||||||
   int B0=B;
 | 
					   int B0=B;
 | 
				
			||||||
   opus_val16 mid=0, side=0;
 | 
					   opus_val16 mid=0, side=0;
 | 
				
			||||||
   unsigned cm=0;
 | 
					   unsigned cm=0;
 | 
				
			||||||
#ifdef RESYNTH
 | 
					 | 
				
			||||||
   int resynth = 1;
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
   int resynth = !ctx->encode;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
   celt_norm *Y=NULL;
 | 
					   celt_norm *Y=NULL;
 | 
				
			||||||
   int encode;
 | 
					   int encode;
 | 
				
			||||||
   const CELTMode *m;
 | 
					   const CELTMode *m;
 | 
				
			||||||
@@ -935,8 +984,7 @@ static unsigned quant_partition(struct band_ctx *ctx, celt_norm *X,
 | 
				
			|||||||
         fill = (fill&1)|(fill<<1);
 | 
					         fill = (fill&1)|(fill<<1);
 | 
				
			||||||
      B = (B+1)>>1;
 | 
					      B = (B+1)>>1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      compute_theta(ctx, &sctx, X, Y, N, &b, B, B0,
 | 
					      compute_theta(ctx, &sctx, X, Y, N, &b, B, B0, LM, 0, &fill);
 | 
				
			||||||
            LM, 0, &fill);
 | 
					 | 
				
			||||||
      imid = sctx.imid;
 | 
					      imid = sctx.imid;
 | 
				
			||||||
      iside = sctx.iside;
 | 
					      iside = sctx.iside;
 | 
				
			||||||
      delta = sctx.delta;
 | 
					      delta = sctx.delta;
 | 
				
			||||||
@@ -970,24 +1018,20 @@ static unsigned quant_partition(struct band_ctx *ctx, celt_norm *X,
 | 
				
			|||||||
      rebalance = ctx->remaining_bits;
 | 
					      rebalance = ctx->remaining_bits;
 | 
				
			||||||
      if (mbits >= sbits)
 | 
					      if (mbits >= sbits)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
         cm = quant_partition(ctx, X, N, mbits, B,
 | 
					         cm = quant_partition(ctx, X, N, mbits, B, lowband, LM,
 | 
				
			||||||
               lowband, LM,
 | 
					 | 
				
			||||||
               MULT16_16_P15(gain,mid), fill);
 | 
					               MULT16_16_P15(gain,mid), fill);
 | 
				
			||||||
         rebalance = mbits - (rebalance-ctx->remaining_bits);
 | 
					         rebalance = mbits - (rebalance-ctx->remaining_bits);
 | 
				
			||||||
         if (rebalance > 3<<BITRES && itheta!=0)
 | 
					         if (rebalance > 3<<BITRES && itheta!=0)
 | 
				
			||||||
            sbits += rebalance - (3<<BITRES);
 | 
					            sbits += rebalance - (3<<BITRES);
 | 
				
			||||||
         cm |= quant_partition(ctx, Y, N, sbits, B,
 | 
					         cm |= quant_partition(ctx, Y, N, sbits, B, next_lowband2, LM,
 | 
				
			||||||
               next_lowband2, LM,
 | 
					 | 
				
			||||||
               MULT16_16_P15(gain,side), fill>>B)<<(B0>>1);
 | 
					               MULT16_16_P15(gain,side), fill>>B)<<(B0>>1);
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
         cm = quant_partition(ctx, Y, N, sbits, B,
 | 
					         cm = quant_partition(ctx, Y, N, sbits, B, next_lowband2, LM,
 | 
				
			||||||
               next_lowband2, LM,
 | 
					 | 
				
			||||||
               MULT16_16_P15(gain,side), fill>>B)<<(B0>>1);
 | 
					               MULT16_16_P15(gain,side), fill>>B)<<(B0>>1);
 | 
				
			||||||
         rebalance = sbits - (rebalance-ctx->remaining_bits);
 | 
					         rebalance = sbits - (rebalance-ctx->remaining_bits);
 | 
				
			||||||
         if (rebalance > 3<<BITRES && itheta!=16384)
 | 
					         if (rebalance > 3<<BITRES && itheta!=16384)
 | 
				
			||||||
            mbits += rebalance - (3<<BITRES);
 | 
					            mbits += rebalance - (3<<BITRES);
 | 
				
			||||||
         cm |= quant_partition(ctx, X, N, mbits, B,
 | 
					         cm |= quant_partition(ctx, X, N, mbits, B, lowband, LM,
 | 
				
			||||||
               lowband, LM,
 | 
					 | 
				
			||||||
               MULT16_16_P15(gain,mid), fill);
 | 
					               MULT16_16_P15(gain,mid), fill);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
   } else {
 | 
					   } else {
 | 
				
			||||||
@@ -1012,18 +1056,14 @@ static unsigned quant_partition(struct band_ctx *ctx, celt_norm *X,
 | 
				
			|||||||
         /* Finally do the actual quantization */
 | 
					         /* Finally do the actual quantization */
 | 
				
			||||||
         if (encode)
 | 
					         if (encode)
 | 
				
			||||||
         {
 | 
					         {
 | 
				
			||||||
            cm = alg_quant(X, N, K, spread, B, ec
 | 
					            cm = alg_quant(X, N, K, spread, B, ec, gain, ctx->resynth, ctx->arch);
 | 
				
			||||||
#ifdef RESYNTH
 | 
					 | 
				
			||||||
                 , gain
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
                 );
 | 
					 | 
				
			||||||
         } else {
 | 
					         } else {
 | 
				
			||||||
            cm = alg_unquant(X, N, K, spread, B, ec, gain);
 | 
					            cm = alg_unquant(X, N, K, spread, B, ec, gain);
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
         /* If there's no pulse, fill the band anyway */
 | 
					         /* If there's no pulse, fill the band anyway */
 | 
				
			||||||
         int j;
 | 
					         int j;
 | 
				
			||||||
         if (resynth)
 | 
					         if (ctx->resynth)
 | 
				
			||||||
         {
 | 
					         {
 | 
				
			||||||
            unsigned cm_mask;
 | 
					            unsigned cm_mask;
 | 
				
			||||||
            /* B can be as large as 16, so this shift might overflow an int on a
 | 
					            /* B can be as large as 16, so this shift might overflow an int on a
 | 
				
			||||||
@@ -1080,11 +1120,6 @@ static unsigned quant_band(struct band_ctx *ctx, celt_norm *X,
 | 
				
			|||||||
   int recombine=0;
 | 
					   int recombine=0;
 | 
				
			||||||
   int longBlocks;
 | 
					   int longBlocks;
 | 
				
			||||||
   unsigned cm=0;
 | 
					   unsigned cm=0;
 | 
				
			||||||
#ifdef RESYNTH
 | 
					 | 
				
			||||||
   int resynth = 1;
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
   int resynth = !ctx->encode;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
   int k;
 | 
					   int k;
 | 
				
			||||||
   int encode;
 | 
					   int encode;
 | 
				
			||||||
   int tf_change;
 | 
					   int tf_change;
 | 
				
			||||||
@@ -1151,11 +1186,10 @@ static unsigned quant_band(struct band_ctx *ctx, celt_norm *X,
 | 
				
			|||||||
         deinterleave_hadamard(lowband, N_B>>recombine, B0<<recombine, longBlocks);
 | 
					         deinterleave_hadamard(lowband, N_B>>recombine, B0<<recombine, longBlocks);
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   cm = quant_partition(ctx, X, N, b, B, lowband,
 | 
					   cm = quant_partition(ctx, X, N, b, B, lowband, LM, gain, fill);
 | 
				
			||||||
         LM, gain, fill);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
   /* This code is used by the decoder and by the resynthesis-enabled encoder */
 | 
					   /* This code is used by the decoder and by the resynthesis-enabled encoder */
 | 
				
			||||||
   if (resynth)
 | 
					   if (ctx->resynth)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
      /* Undo the sample reorganization going from time order to frequency order */
 | 
					      /* Undo the sample reorganization going from time order to frequency order */
 | 
				
			||||||
      if (B0>1)
 | 
					      if (B0>1)
 | 
				
			||||||
@@ -1208,11 +1242,6 @@ static unsigned quant_band_stereo(struct band_ctx *ctx, celt_norm *X, celt_norm
 | 
				
			|||||||
   int inv = 0;
 | 
					   int inv = 0;
 | 
				
			||||||
   opus_val16 mid=0, side=0;
 | 
					   opus_val16 mid=0, side=0;
 | 
				
			||||||
   unsigned cm=0;
 | 
					   unsigned cm=0;
 | 
				
			||||||
#ifdef RESYNTH
 | 
					 | 
				
			||||||
   int resynth = 1;
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
   int resynth = !ctx->encode;
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
   int mbits, sbits, delta;
 | 
					   int mbits, sbits, delta;
 | 
				
			||||||
   int itheta;
 | 
					   int itheta;
 | 
				
			||||||
   int qalloc;
 | 
					   int qalloc;
 | 
				
			||||||
@@ -1232,8 +1261,7 @@ static unsigned quant_band_stereo(struct band_ctx *ctx, celt_norm *X, celt_norm
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
   orig_fill = fill;
 | 
					   orig_fill = fill;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   compute_theta(ctx, &sctx, X, Y, N, &b, B, B,
 | 
					   compute_theta(ctx, &sctx, X, Y, N, &b, B, B, LM, 1, &fill);
 | 
				
			||||||
         LM, 1, &fill);
 | 
					 | 
				
			||||||
   inv = sctx.inv;
 | 
					   inv = sctx.inv;
 | 
				
			||||||
   imid = sctx.imid;
 | 
					   imid = sctx.imid;
 | 
				
			||||||
   iside = sctx.iside;
 | 
					   iside = sctx.iside;
 | 
				
			||||||
@@ -1281,13 +1309,13 @@ static unsigned quant_band_stereo(struct band_ctx *ctx, celt_norm *X, celt_norm
 | 
				
			|||||||
      sign = 1-2*sign;
 | 
					      sign = 1-2*sign;
 | 
				
			||||||
      /* We use orig_fill here because we want to fold the side, but if
 | 
					      /* We use orig_fill here because we want to fold the side, but if
 | 
				
			||||||
         itheta==16384, we'll have cleared the low bits of fill. */
 | 
					         itheta==16384, we'll have cleared the low bits of fill. */
 | 
				
			||||||
      cm = quant_band(ctx, x2, N, mbits, B, lowband,
 | 
					      cm = quant_band(ctx, x2, N, mbits, B, lowband, LM, lowband_out, Q15ONE,
 | 
				
			||||||
            LM, lowband_out, Q15ONE, lowband_scratch, orig_fill);
 | 
					            lowband_scratch, orig_fill);
 | 
				
			||||||
      /* We don't split N=2 bands, so cm is either 1 or 0 (for a fold-collapse),
 | 
					      /* We don't split N=2 bands, so cm is either 1 or 0 (for a fold-collapse),
 | 
				
			||||||
         and there's no need to worry about mixing with the other channel. */
 | 
					         and there's no need to worry about mixing with the other channel. */
 | 
				
			||||||
      y2[0] = -sign*x2[1];
 | 
					      y2[0] = -sign*x2[1];
 | 
				
			||||||
      y2[1] = sign*x2[0];
 | 
					      y2[1] = sign*x2[0];
 | 
				
			||||||
      if (resynth)
 | 
					      if (ctx->resynth)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
         celt_norm tmp;
 | 
					         celt_norm tmp;
 | 
				
			||||||
         X[0] = MULT16_16_Q15(mid, X[0]);
 | 
					         X[0] = MULT16_16_Q15(mid, X[0]);
 | 
				
			||||||
@@ -1314,38 +1342,32 @@ static unsigned quant_band_stereo(struct band_ctx *ctx, celt_norm *X, celt_norm
 | 
				
			|||||||
      {
 | 
					      {
 | 
				
			||||||
         /* In stereo mode, we do not apply a scaling to the mid because we need the normalized
 | 
					         /* In stereo mode, we do not apply a scaling to the mid because we need the normalized
 | 
				
			||||||
            mid for folding later. */
 | 
					            mid for folding later. */
 | 
				
			||||||
         cm = quant_band(ctx, X, N, mbits, B,
 | 
					         cm = quant_band(ctx, X, N, mbits, B, lowband, LM, lowband_out, Q15ONE,
 | 
				
			||||||
               lowband, LM, lowband_out,
 | 
					               lowband_scratch, fill);
 | 
				
			||||||
               Q15ONE, lowband_scratch, fill);
 | 
					 | 
				
			||||||
         rebalance = mbits - (rebalance-ctx->remaining_bits);
 | 
					         rebalance = mbits - (rebalance-ctx->remaining_bits);
 | 
				
			||||||
         if (rebalance > 3<<BITRES && itheta!=0)
 | 
					         if (rebalance > 3<<BITRES && itheta!=0)
 | 
				
			||||||
            sbits += rebalance - (3<<BITRES);
 | 
					            sbits += rebalance - (3<<BITRES);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         /* For a stereo split, the high bits of fill are always zero, so no
 | 
					         /* For a stereo split, the high bits of fill are always zero, so no
 | 
				
			||||||
            folding will be done to the side. */
 | 
					            folding will be done to the side. */
 | 
				
			||||||
         cm |= quant_band(ctx, Y, N, sbits, B,
 | 
					         cm |= quant_band(ctx, Y, N, sbits, B, NULL, LM, NULL, side, NULL, fill>>B);
 | 
				
			||||||
               NULL, LM, NULL,
 | 
					 | 
				
			||||||
               side, NULL, fill>>B);
 | 
					 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
         /* For a stereo split, the high bits of fill are always zero, so no
 | 
					         /* For a stereo split, the high bits of fill are always zero, so no
 | 
				
			||||||
            folding will be done to the side. */
 | 
					            folding will be done to the side. */
 | 
				
			||||||
         cm = quant_band(ctx, Y, N, sbits, B,
 | 
					         cm = quant_band(ctx, Y, N, sbits, B, NULL, LM, NULL, side, NULL, fill>>B);
 | 
				
			||||||
               NULL, LM, NULL,
 | 
					 | 
				
			||||||
               side, NULL, fill>>B);
 | 
					 | 
				
			||||||
         rebalance = sbits - (rebalance-ctx->remaining_bits);
 | 
					         rebalance = sbits - (rebalance-ctx->remaining_bits);
 | 
				
			||||||
         if (rebalance > 3<<BITRES && itheta!=16384)
 | 
					         if (rebalance > 3<<BITRES && itheta!=16384)
 | 
				
			||||||
            mbits += rebalance - (3<<BITRES);
 | 
					            mbits += rebalance - (3<<BITRES);
 | 
				
			||||||
         /* In stereo mode, we do not apply a scaling to the mid because we need the normalized
 | 
					         /* In stereo mode, we do not apply a scaling to the mid because we need the normalized
 | 
				
			||||||
            mid for folding later. */
 | 
					            mid for folding later. */
 | 
				
			||||||
         cm |= quant_band(ctx, X, N, mbits, B,
 | 
					         cm |= quant_band(ctx, X, N, mbits, B, lowband, LM, lowband_out, Q15ONE,
 | 
				
			||||||
               lowband, LM, lowband_out,
 | 
					               lowband_scratch, fill);
 | 
				
			||||||
               Q15ONE, lowband_scratch, fill);
 | 
					 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   /* This code is used by the decoder and by the resynthesis-enabled encoder */
 | 
					   /* This code is used by the decoder and by the resynthesis-enabled encoder */
 | 
				
			||||||
   if (resynth)
 | 
					   if (ctx->resynth)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
      if (N!=2)
 | 
					      if (N!=2)
 | 
				
			||||||
         stereo_merge(X, Y, mid, N, ctx->arch);
 | 
					         stereo_merge(X, Y, mid, N, ctx->arch);
 | 
				
			||||||
@@ -1359,19 +1381,38 @@ static unsigned quant_band_stereo(struct band_ctx *ctx, celt_norm *X, celt_norm
 | 
				
			|||||||
   return cm;
 | 
					   return cm;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void special_hybrid_folding(const CELTMode *m, celt_norm *norm, celt_norm *norm2, int start, int M, int dual_stereo)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   int n1, n2;
 | 
				
			||||||
 | 
					   const opus_int16 * OPUS_RESTRICT eBands = m->eBands;
 | 
				
			||||||
 | 
					   n1 = M*(eBands[start+1]-eBands[start]);
 | 
				
			||||||
 | 
					   n2 = M*(eBands[start+2]-eBands[start+1]);
 | 
				
			||||||
 | 
					   /* Duplicate enough of the first band folding data to be able to fold the second band.
 | 
				
			||||||
 | 
					      Copies no data for CELT-only mode. */
 | 
				
			||||||
 | 
					   OPUS_COPY(&norm[n1], &norm[2*n1 - n2], n2-n1);
 | 
				
			||||||
 | 
					   if (dual_stereo)
 | 
				
			||||||
 | 
					      OPUS_COPY(&norm2[n1], &norm2[2*n1 - n2], n2-n1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void quant_all_bands(int encode, const CELTMode *m, int start, int end,
 | 
					void quant_all_bands(int encode, const CELTMode *m, int start, int end,
 | 
				
			||||||
      celt_norm *X_, celt_norm *Y_, unsigned char *collapse_masks,
 | 
					      celt_norm *X_, celt_norm *Y_, unsigned char *collapse_masks,
 | 
				
			||||||
      const celt_ener *bandE, int *pulses, int shortBlocks, int spread,
 | 
					      const celt_ener *bandE, int *pulses, int shortBlocks, int spread,
 | 
				
			||||||
      int dual_stereo, int intensity, int *tf_res, opus_int32 total_bits,
 | 
					      int dual_stereo, int intensity, int *tf_res, opus_int32 total_bits,
 | 
				
			||||||
      opus_int32 balance, ec_ctx *ec, int LM, int codedBands,
 | 
					      opus_int32 balance, ec_ctx *ec, int LM, int codedBands,
 | 
				
			||||||
      opus_uint32 *seed, int arch)
 | 
					      opus_uint32 *seed, int complexity, int arch, int disable_inv)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   int i;
 | 
					   int i;
 | 
				
			||||||
   opus_int32 remaining_bits;
 | 
					   opus_int32 remaining_bits;
 | 
				
			||||||
   const opus_int16 * OPUS_RESTRICT eBands = m->eBands;
 | 
					   const opus_int16 * OPUS_RESTRICT eBands = m->eBands;
 | 
				
			||||||
   celt_norm * OPUS_RESTRICT norm, * OPUS_RESTRICT norm2;
 | 
					   celt_norm * OPUS_RESTRICT norm, * OPUS_RESTRICT norm2;
 | 
				
			||||||
   VARDECL(celt_norm, _norm);
 | 
					   VARDECL(celt_norm, _norm);
 | 
				
			||||||
 | 
					   VARDECL(celt_norm, _lowband_scratch);
 | 
				
			||||||
 | 
					   VARDECL(celt_norm, X_save);
 | 
				
			||||||
 | 
					   VARDECL(celt_norm, Y_save);
 | 
				
			||||||
 | 
					   VARDECL(celt_norm, X_save2);
 | 
				
			||||||
 | 
					   VARDECL(celt_norm, Y_save2);
 | 
				
			||||||
 | 
					   VARDECL(celt_norm, norm_save2);
 | 
				
			||||||
 | 
					   int resynth_alloc;
 | 
				
			||||||
   celt_norm *lowband_scratch;
 | 
					   celt_norm *lowband_scratch;
 | 
				
			||||||
   int B;
 | 
					   int B;
 | 
				
			||||||
   int M;
 | 
					   int M;
 | 
				
			||||||
@@ -1379,10 +1420,11 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end,
 | 
				
			|||||||
   int update_lowband = 1;
 | 
					   int update_lowband = 1;
 | 
				
			||||||
   int C = Y_ != NULL ? 2 : 1;
 | 
					   int C = Y_ != NULL ? 2 : 1;
 | 
				
			||||||
   int norm_offset;
 | 
					   int norm_offset;
 | 
				
			||||||
 | 
					   int theta_rdo = encode && Y_!=NULL && !dual_stereo && complexity>=8;
 | 
				
			||||||
#ifdef RESYNTH
 | 
					#ifdef RESYNTH
 | 
				
			||||||
   int resynth = 1;
 | 
					   int resynth = 1;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
   int resynth = !encode;
 | 
					   int resynth = !encode || theta_rdo;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
   struct band_ctx ctx;
 | 
					   struct band_ctx ctx;
 | 
				
			||||||
   SAVE_STACK;
 | 
					   SAVE_STACK;
 | 
				
			||||||
@@ -1395,9 +1437,24 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end,
 | 
				
			|||||||
   ALLOC(_norm, C*(M*eBands[m->nbEBands-1]-norm_offset), celt_norm);
 | 
					   ALLOC(_norm, C*(M*eBands[m->nbEBands-1]-norm_offset), celt_norm);
 | 
				
			||||||
   norm = _norm;
 | 
					   norm = _norm;
 | 
				
			||||||
   norm2 = norm + M*eBands[m->nbEBands-1]-norm_offset;
 | 
					   norm2 = norm + M*eBands[m->nbEBands-1]-norm_offset;
 | 
				
			||||||
   /* We can use the last band as scratch space because we don't need that
 | 
					
 | 
				
			||||||
      scratch space for the last band. */
 | 
					   /* For decoding, we can use the last band as scratch space because we don't need that
 | 
				
			||||||
   lowband_scratch = X_+M*eBands[m->nbEBands-1];
 | 
					      scratch space for the last band and we don't care about the data there until we're
 | 
				
			||||||
 | 
					      decoding the last band. */
 | 
				
			||||||
 | 
					   if (encode && resynth)
 | 
				
			||||||
 | 
					      resynth_alloc = M*(eBands[m->nbEBands]-eBands[m->nbEBands-1]);
 | 
				
			||||||
 | 
					   else
 | 
				
			||||||
 | 
					      resynth_alloc = ALLOC_NONE;
 | 
				
			||||||
 | 
					   ALLOC(_lowband_scratch, resynth_alloc, celt_norm);
 | 
				
			||||||
 | 
					   if (encode && resynth)
 | 
				
			||||||
 | 
					      lowband_scratch = _lowband_scratch;
 | 
				
			||||||
 | 
					   else
 | 
				
			||||||
 | 
					      lowband_scratch = X_+M*eBands[m->nbEBands-1];
 | 
				
			||||||
 | 
					   ALLOC(X_save, resynth_alloc, celt_norm);
 | 
				
			||||||
 | 
					   ALLOC(Y_save, resynth_alloc, celt_norm);
 | 
				
			||||||
 | 
					   ALLOC(X_save2, resynth_alloc, celt_norm);
 | 
				
			||||||
 | 
					   ALLOC(Y_save2, resynth_alloc, celt_norm);
 | 
				
			||||||
 | 
					   ALLOC(norm_save2, resynth_alloc, celt_norm);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   lowband_offset = 0;
 | 
					   lowband_offset = 0;
 | 
				
			||||||
   ctx.bandE = bandE;
 | 
					   ctx.bandE = bandE;
 | 
				
			||||||
@@ -1408,6 +1465,11 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end,
 | 
				
			|||||||
   ctx.seed = *seed;
 | 
					   ctx.seed = *seed;
 | 
				
			||||||
   ctx.spread = spread;
 | 
					   ctx.spread = spread;
 | 
				
			||||||
   ctx.arch = arch;
 | 
					   ctx.arch = arch;
 | 
				
			||||||
 | 
					   ctx.disable_inv = disable_inv;
 | 
				
			||||||
 | 
					   ctx.resynth = resynth;
 | 
				
			||||||
 | 
					   ctx.theta_round = 0;
 | 
				
			||||||
 | 
					   /* Avoid injecting noise in the first band on transients. */
 | 
				
			||||||
 | 
					   ctx.avoid_split_noise = B > 1;
 | 
				
			||||||
   for (i=start;i<end;i++)
 | 
					   for (i=start;i<end;i++)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
      opus_int32 tell;
 | 
					      opus_int32 tell;
 | 
				
			||||||
@@ -1430,6 +1492,7 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end,
 | 
				
			|||||||
      else
 | 
					      else
 | 
				
			||||||
         Y = NULL;
 | 
					         Y = NULL;
 | 
				
			||||||
      N = M*eBands[i+1]-M*eBands[i];
 | 
					      N = M*eBands[i+1]-M*eBands[i];
 | 
				
			||||||
 | 
					      celt_assert(N > 0);
 | 
				
			||||||
      tell = ec_tell_frac(ec);
 | 
					      tell = ec_tell_frac(ec);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      /* Compute how many bits we want to allocate to this band */
 | 
					      /* Compute how many bits we want to allocate to this band */
 | 
				
			||||||
@@ -1445,8 +1508,15 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end,
 | 
				
			|||||||
         b = 0;
 | 
					         b = 0;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef DISABLE_UPDATE_DRAFT
 | 
				
			||||||
 | 
					      if (resynth && (M*eBands[i]-N >= M*eBands[start] || i==start+1) && (update_lowband || lowband_offset==0))
 | 
				
			||||||
 | 
					            lowband_offset = i;
 | 
				
			||||||
 | 
					      if (i == start+1)
 | 
				
			||||||
 | 
					         special_hybrid_folding(m, norm, norm2, start, M, dual_stereo);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
      if (resynth && M*eBands[i]-N >= M*eBands[start] && (update_lowband || lowband_offset==0))
 | 
					      if (resynth && M*eBands[i]-N >= M*eBands[start] && (update_lowband || lowband_offset==0))
 | 
				
			||||||
            lowband_offset = i;
 | 
					            lowband_offset = i;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      tf_change = tf_res[i];
 | 
					      tf_change = tf_res[i];
 | 
				
			||||||
      ctx.tf_change = tf_change;
 | 
					      ctx.tf_change = tf_change;
 | 
				
			||||||
@@ -1457,7 +1527,7 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end,
 | 
				
			|||||||
            Y = norm;
 | 
					            Y = norm;
 | 
				
			||||||
         lowband_scratch = NULL;
 | 
					         lowband_scratch = NULL;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      if (i==end-1)
 | 
					      if (last && !theta_rdo)
 | 
				
			||||||
         lowband_scratch = NULL;
 | 
					         lowband_scratch = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      /* Get a conservative estimate of the collapse_mask's for the bands we're
 | 
					      /* Get a conservative estimate of the collapse_mask's for the bands we're
 | 
				
			||||||
@@ -1472,7 +1542,11 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end,
 | 
				
			|||||||
         fold_start = lowband_offset;
 | 
					         fold_start = lowband_offset;
 | 
				
			||||||
         while(M*eBands[--fold_start] > effective_lowband+norm_offset);
 | 
					         while(M*eBands[--fold_start] > effective_lowband+norm_offset);
 | 
				
			||||||
         fold_end = lowband_offset-1;
 | 
					         fold_end = lowband_offset-1;
 | 
				
			||||||
 | 
					#ifndef DISABLE_UPDATE_DRAFT
 | 
				
			||||||
 | 
					         while(++fold_end < i && M*eBands[fold_end] < effective_lowband+norm_offset+N);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
         while(M*eBands[++fold_end] < effective_lowband+norm_offset+N);
 | 
					         while(M*eBands[++fold_end] < effective_lowband+norm_offset+N);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
         x_cm = y_cm = 0;
 | 
					         x_cm = y_cm = 0;
 | 
				
			||||||
         fold_i = fold_start; do {
 | 
					         fold_i = fold_start; do {
 | 
				
			||||||
           x_cm |= collapse_masks[fold_i*C+0];
 | 
					           x_cm |= collapse_masks[fold_i*C+0];
 | 
				
			||||||
@@ -1505,13 +1579,79 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end,
 | 
				
			|||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
         if (Y!=NULL)
 | 
					         if (Y!=NULL)
 | 
				
			||||||
         {
 | 
					         {
 | 
				
			||||||
            x_cm = quant_band_stereo(&ctx, X, Y, N, b, B,
 | 
					            if (theta_rdo && i < intensity)
 | 
				
			||||||
                  effective_lowband != -1 ? norm+effective_lowband : NULL, LM,
 | 
					            {
 | 
				
			||||||
                        last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, x_cm|y_cm);
 | 
					               ec_ctx ec_save, ec_save2;
 | 
				
			||||||
 | 
					               struct band_ctx ctx_save, ctx_save2;
 | 
				
			||||||
 | 
					               opus_val32 dist0, dist1;
 | 
				
			||||||
 | 
					               unsigned cm, cm2;
 | 
				
			||||||
 | 
					               int nstart_bytes, nend_bytes, save_bytes;
 | 
				
			||||||
 | 
					               unsigned char *bytes_buf;
 | 
				
			||||||
 | 
					               unsigned char bytes_save[1275];
 | 
				
			||||||
 | 
					               opus_val16 w[2];
 | 
				
			||||||
 | 
					               compute_channel_weights(bandE[i], bandE[i+m->nbEBands], w);
 | 
				
			||||||
 | 
					               /* Make a copy. */
 | 
				
			||||||
 | 
					               cm = x_cm|y_cm;
 | 
				
			||||||
 | 
					               ec_save = *ec;
 | 
				
			||||||
 | 
					               ctx_save = ctx;
 | 
				
			||||||
 | 
					               OPUS_COPY(X_save, X, N);
 | 
				
			||||||
 | 
					               OPUS_COPY(Y_save, Y, N);
 | 
				
			||||||
 | 
					               /* Encode and round down. */
 | 
				
			||||||
 | 
					               ctx.theta_round = -1;
 | 
				
			||||||
 | 
					               x_cm = quant_band_stereo(&ctx, X, Y, N, b, B,
 | 
				
			||||||
 | 
					                     effective_lowband != -1 ? norm+effective_lowband : NULL, LM,
 | 
				
			||||||
 | 
					                     last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, cm);
 | 
				
			||||||
 | 
					               dist0 = MULT16_32_Q15(w[0], celt_inner_prod(X_save, X, N, arch)) + MULT16_32_Q15(w[1], celt_inner_prod(Y_save, Y, N, arch));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					               /* Save first result. */
 | 
				
			||||||
 | 
					               cm2 = x_cm;
 | 
				
			||||||
 | 
					               ec_save2 = *ec;
 | 
				
			||||||
 | 
					               ctx_save2 = ctx;
 | 
				
			||||||
 | 
					               OPUS_COPY(X_save2, X, N);
 | 
				
			||||||
 | 
					               OPUS_COPY(Y_save2, Y, N);
 | 
				
			||||||
 | 
					               if (!last)
 | 
				
			||||||
 | 
					                  OPUS_COPY(norm_save2, norm+M*eBands[i]-norm_offset, N);
 | 
				
			||||||
 | 
					               nstart_bytes = ec_save.offs;
 | 
				
			||||||
 | 
					               nend_bytes = ec_save.storage;
 | 
				
			||||||
 | 
					               bytes_buf = ec_save.buf+nstart_bytes;
 | 
				
			||||||
 | 
					               save_bytes = nend_bytes-nstart_bytes;
 | 
				
			||||||
 | 
					               OPUS_COPY(bytes_save, bytes_buf, save_bytes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					               /* Restore */
 | 
				
			||||||
 | 
					               *ec = ec_save;
 | 
				
			||||||
 | 
					               ctx = ctx_save;
 | 
				
			||||||
 | 
					               OPUS_COPY(X, X_save, N);
 | 
				
			||||||
 | 
					               OPUS_COPY(Y, Y_save, N);
 | 
				
			||||||
 | 
					#ifndef DISABLE_UPDATE_DRAFT
 | 
				
			||||||
 | 
					               if (i == start+1)
 | 
				
			||||||
 | 
					                  special_hybrid_folding(m, norm, norm2, start, M, dual_stereo);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					               /* Encode and round up. */
 | 
				
			||||||
 | 
					               ctx.theta_round = 1;
 | 
				
			||||||
 | 
					               x_cm = quant_band_stereo(&ctx, X, Y, N, b, B,
 | 
				
			||||||
 | 
					                     effective_lowband != -1 ? norm+effective_lowband : NULL, LM,
 | 
				
			||||||
 | 
					                     last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, cm);
 | 
				
			||||||
 | 
					               dist1 = MULT16_32_Q15(w[0], celt_inner_prod(X_save, X, N, arch)) + MULT16_32_Q15(w[1], celt_inner_prod(Y_save, Y, N, arch));
 | 
				
			||||||
 | 
					               if (dist0 >= dist1) {
 | 
				
			||||||
 | 
					                  x_cm = cm2;
 | 
				
			||||||
 | 
					                  *ec = ec_save2;
 | 
				
			||||||
 | 
					                  ctx = ctx_save2;
 | 
				
			||||||
 | 
					                  OPUS_COPY(X, X_save2, N);
 | 
				
			||||||
 | 
					                  OPUS_COPY(Y, Y_save2, N);
 | 
				
			||||||
 | 
					                  if (!last)
 | 
				
			||||||
 | 
					                     OPUS_COPY(norm+M*eBands[i]-norm_offset, norm_save2, N);
 | 
				
			||||||
 | 
					                  OPUS_COPY(bytes_buf, bytes_save, save_bytes);
 | 
				
			||||||
 | 
					               }
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					               ctx.theta_round = 0;
 | 
				
			||||||
 | 
					               x_cm = quant_band_stereo(&ctx, X, Y, N, b, B,
 | 
				
			||||||
 | 
					                     effective_lowband != -1 ? norm+effective_lowband : NULL, LM,
 | 
				
			||||||
 | 
					                     last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, x_cm|y_cm);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
         } else {
 | 
					         } else {
 | 
				
			||||||
            x_cm = quant_band(&ctx, X, N, b, B,
 | 
					            x_cm = quant_band(&ctx, X, N, b, B,
 | 
				
			||||||
                  effective_lowband != -1 ? norm+effective_lowband : NULL, LM,
 | 
					                  effective_lowband != -1 ? norm+effective_lowband : NULL, LM,
 | 
				
			||||||
                        last?NULL:norm+M*eBands[i]-norm_offset, Q15ONE, lowband_scratch, x_cm|y_cm);
 | 
					                  last?NULL:norm+M*eBands[i]-norm_offset, Q15ONE, lowband_scratch, x_cm|y_cm);
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
         y_cm = x_cm;
 | 
					         y_cm = x_cm;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -1521,6 +1661,9 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      /* Update the folding position only as long as we have 1 bit/sample depth. */
 | 
					      /* Update the folding position only as long as we have 1 bit/sample depth. */
 | 
				
			||||||
      update_lowband = b>(N<<BITRES);
 | 
					      update_lowband = b>(N<<BITRES);
 | 
				
			||||||
 | 
					      /* We only need to avoid noise on a split for the first band. After that, we
 | 
				
			||||||
 | 
					         have folding. */
 | 
				
			||||||
 | 
					      ctx.avoid_split_noise = 0;
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
   *seed = ctx.seed;
 | 
					   *seed = ctx.seed;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -36,12 +36,15 @@
 | 
				
			|||||||
#include "entdec.h"
 | 
					#include "entdec.h"
 | 
				
			||||||
#include "rate.h"
 | 
					#include "rate.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					opus_int16 bitexact_cos(opus_int16 x);
 | 
				
			||||||
 | 
					int bitexact_log2tan(int isin,int icos);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Compute the amplitude (sqrt energy) in each of the bands
 | 
					/** Compute the amplitude (sqrt energy) in each of the bands
 | 
				
			||||||
 * @param m Mode data
 | 
					 * @param m Mode data
 | 
				
			||||||
 * @param X Spectrum
 | 
					 * @param X Spectrum
 | 
				
			||||||
 * @param bandE Square root of the energy for each band (returned)
 | 
					 * @param bandE Square root of the energy for each band (returned)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int LM);
 | 
					void compute_band_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int LM, int arch);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*void compute_noise_energies(const CELTMode *m, const celt_sig *X, const opus_val16 *tonality, celt_ener *bandE);*/
 | 
					/*void compute_noise_energies(const CELTMode *m, const celt_sig *X, const opus_val16 *tonality, celt_ener *bandE);*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -69,7 +72,7 @@ void denormalise_bands(const CELTMode *m, const celt_norm * OPUS_RESTRICT X,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
int spreading_decision(const CELTMode *m, const celt_norm *X, int *average,
 | 
					int spreading_decision(const CELTMode *m, const celt_norm *X, int *average,
 | 
				
			||||||
      int last_decision, int *hf_average, int *tapset_decision, int update_hf,
 | 
					      int last_decision, int *hf_average, int *tapset_decision, int update_hf,
 | 
				
			||||||
      int end, int C, int M);
 | 
					      int end, int C, int M, const int *spread_weight);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef MEASURE_NORM_MSE
 | 
					#ifdef MEASURE_NORM_MSE
 | 
				
			||||||
void measure_norm_mse(const CELTMode *m, float *X, float *X0, float *bandE, float *bandE0, int M, int N, int C);
 | 
					void measure_norm_mse(const CELTMode *m, float *X, float *X0, float *bandE, float *bandE0, int M, int N, int C);
 | 
				
			||||||
@@ -105,7 +108,7 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end,
 | 
				
			|||||||
      const celt_ener *bandE, int *pulses, int shortBlocks, int spread,
 | 
					      const celt_ener *bandE, int *pulses, int shortBlocks, int spread,
 | 
				
			||||||
      int dual_stereo, int intensity, int *tf_res, opus_int32 total_bits,
 | 
					      int dual_stereo, int intensity, int *tf_res, opus_int32 total_bits,
 | 
				
			||||||
      opus_int32 balance, ec_ctx *ec, int M, int codedBands, opus_uint32 *seed,
 | 
					      opus_int32 balance, ec_ctx *ec, int M, int codedBands, opus_uint32 *seed,
 | 
				
			||||||
      int arch);
 | 
					      int complexity, int arch, int disable_inv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void anti_collapse(const CELTMode *m, celt_norm *X_,
 | 
					void anti_collapse(const CELTMode *m, celt_norm *X_,
 | 
				
			||||||
      unsigned char *collapse_masks, int LM, int C, int size, int start,
 | 
					      unsigned char *collapse_masks, int LM, int C, int size, int start,
 | 
				
			||||||
@@ -111,26 +111,31 @@ void comb_filter_const_c(opus_val32 *y, opus_val32 *x, int T, int N,
 | 
				
			|||||||
      t = MAC16_32_Q16(x[i], g10, x2);
 | 
					      t = MAC16_32_Q16(x[i], g10, x2);
 | 
				
			||||||
      t = MAC16_32_Q16(t, g11, ADD32(x1,x3));
 | 
					      t = MAC16_32_Q16(t, g11, ADD32(x1,x3));
 | 
				
			||||||
      t = MAC16_32_Q16(t, g12, ADD32(x0,x4));
 | 
					      t = MAC16_32_Q16(t, g12, ADD32(x0,x4));
 | 
				
			||||||
 | 
					      t = SATURATE(t, SIG_SAT);
 | 
				
			||||||
      y[i] = t;
 | 
					      y[i] = t;
 | 
				
			||||||
      x4=SHL32(x[i-T+3],1);
 | 
					      x4=SHL32(x[i-T+3],1);
 | 
				
			||||||
      t = MAC16_32_Q16(x[i+1], g10, x1);
 | 
					      t = MAC16_32_Q16(x[i+1], g10, x1);
 | 
				
			||||||
      t = MAC16_32_Q16(t, g11, ADD32(x0,x2));
 | 
					      t = MAC16_32_Q16(t, g11, ADD32(x0,x2));
 | 
				
			||||||
      t = MAC16_32_Q16(t, g12, ADD32(x4,x3));
 | 
					      t = MAC16_32_Q16(t, g12, ADD32(x4,x3));
 | 
				
			||||||
 | 
					      t = SATURATE(t, SIG_SAT);
 | 
				
			||||||
      y[i+1] = t;
 | 
					      y[i+1] = t;
 | 
				
			||||||
      x3=SHL32(x[i-T+4],1);
 | 
					      x3=SHL32(x[i-T+4],1);
 | 
				
			||||||
      t = MAC16_32_Q16(x[i+2], g10, x0);
 | 
					      t = MAC16_32_Q16(x[i+2], g10, x0);
 | 
				
			||||||
      t = MAC16_32_Q16(t, g11, ADD32(x4,x1));
 | 
					      t = MAC16_32_Q16(t, g11, ADD32(x4,x1));
 | 
				
			||||||
      t = MAC16_32_Q16(t, g12, ADD32(x3,x2));
 | 
					      t = MAC16_32_Q16(t, g12, ADD32(x3,x2));
 | 
				
			||||||
 | 
					      t = SATURATE(t, SIG_SAT);
 | 
				
			||||||
      y[i+2] = t;
 | 
					      y[i+2] = t;
 | 
				
			||||||
      x2=SHL32(x[i-T+5],1);
 | 
					      x2=SHL32(x[i-T+5],1);
 | 
				
			||||||
      t = MAC16_32_Q16(x[i+3], g10, x4);
 | 
					      t = MAC16_32_Q16(x[i+3], g10, x4);
 | 
				
			||||||
      t = MAC16_32_Q16(t, g11, ADD32(x3,x0));
 | 
					      t = MAC16_32_Q16(t, g11, ADD32(x3,x0));
 | 
				
			||||||
      t = MAC16_32_Q16(t, g12, ADD32(x2,x1));
 | 
					      t = MAC16_32_Q16(t, g12, ADD32(x2,x1));
 | 
				
			||||||
 | 
					      t = SATURATE(t, SIG_SAT);
 | 
				
			||||||
      y[i+3] = t;
 | 
					      y[i+3] = t;
 | 
				
			||||||
      x1=SHL32(x[i-T+6],1);
 | 
					      x1=SHL32(x[i-T+6],1);
 | 
				
			||||||
      t = MAC16_32_Q16(x[i+4], g10, x3);
 | 
					      t = MAC16_32_Q16(x[i+4], g10, x3);
 | 
				
			||||||
      t = MAC16_32_Q16(t, g11, ADD32(x2,x4));
 | 
					      t = MAC16_32_Q16(t, g11, ADD32(x2,x4));
 | 
				
			||||||
      t = MAC16_32_Q16(t, g12, ADD32(x1,x0));
 | 
					      t = MAC16_32_Q16(t, g12, ADD32(x1,x0));
 | 
				
			||||||
 | 
					      t = SATURATE(t, SIG_SAT);
 | 
				
			||||||
      y[i+4] = t;
 | 
					      y[i+4] = t;
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
#ifdef CUSTOM_MODES
 | 
					#ifdef CUSTOM_MODES
 | 
				
			||||||
@@ -141,6 +146,7 @@ void comb_filter_const_c(opus_val32 *y, opus_val32 *x, int T, int N,
 | 
				
			|||||||
      t = MAC16_32_Q16(x[i], g10, x2);
 | 
					      t = MAC16_32_Q16(x[i], g10, x2);
 | 
				
			||||||
      t = MAC16_32_Q16(t, g11, ADD32(x1,x3));
 | 
					      t = MAC16_32_Q16(t, g11, ADD32(x1,x3));
 | 
				
			||||||
      t = MAC16_32_Q16(t, g12, ADD32(x0,x4));
 | 
					      t = MAC16_32_Q16(t, g12, ADD32(x0,x4));
 | 
				
			||||||
 | 
					      t = SATURATE(t, SIG_SAT);
 | 
				
			||||||
      y[i] = t;
 | 
					      y[i] = t;
 | 
				
			||||||
      x4=x3;
 | 
					      x4=x3;
 | 
				
			||||||
      x3=x2;
 | 
					      x3=x2;
 | 
				
			||||||
@@ -169,6 +175,7 @@ void comb_filter_const_c(opus_val32 *y, opus_val32 *x, int T, int N,
 | 
				
			|||||||
               + MULT16_32_Q15(g10,x2)
 | 
					               + MULT16_32_Q15(g10,x2)
 | 
				
			||||||
               + MULT16_32_Q15(g11,ADD32(x1,x3))
 | 
					               + MULT16_32_Q15(g11,ADD32(x1,x3))
 | 
				
			||||||
               + MULT16_32_Q15(g12,ADD32(x0,x4));
 | 
					               + MULT16_32_Q15(g12,ADD32(x0,x4));
 | 
				
			||||||
 | 
					      y[i] = SATURATE(y[i], SIG_SAT);
 | 
				
			||||||
      x4=x3;
 | 
					      x4=x3;
 | 
				
			||||||
      x3=x2;
 | 
					      x3=x2;
 | 
				
			||||||
      x2=x1;
 | 
					      x2=x1;
 | 
				
			||||||
@@ -200,6 +207,10 @@ void comb_filter(opus_val32 *y, opus_val32 *x, int T0, int T1, int N,
 | 
				
			|||||||
         OPUS_MOVE(y, x, N);
 | 
					         OPUS_MOVE(y, x, N);
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 | 
					   /* When the gain is zero, T0 and/or T1 is set to zero. We need
 | 
				
			||||||
 | 
					      to have then be at least 2 to avoid processing garbage data. */
 | 
				
			||||||
 | 
					   T0 = IMAX(T0, COMBFILTER_MINPERIOD);
 | 
				
			||||||
 | 
					   T1 = IMAX(T1, COMBFILTER_MINPERIOD);
 | 
				
			||||||
   g00 = MULT16_16_P15(g0, gains[tapset0][0]);
 | 
					   g00 = MULT16_16_P15(g0, gains[tapset0][0]);
 | 
				
			||||||
   g01 = MULT16_16_P15(g0, gains[tapset0][1]);
 | 
					   g01 = MULT16_16_P15(g0, gains[tapset0][1]);
 | 
				
			||||||
   g02 = MULT16_16_P15(g0, gains[tapset0][2]);
 | 
					   g02 = MULT16_16_P15(g0, gains[tapset0][2]);
 | 
				
			||||||
@@ -225,6 +236,7 @@ void comb_filter(opus_val32 *y, opus_val32 *x, int T0, int T1, int N,
 | 
				
			|||||||
               + MULT16_32_Q15(MULT16_16_Q15(f,g10),x2)
 | 
					               + MULT16_32_Q15(MULT16_16_Q15(f,g10),x2)
 | 
				
			||||||
               + MULT16_32_Q15(MULT16_16_Q15(f,g11),ADD32(x1,x3))
 | 
					               + MULT16_32_Q15(MULT16_16_Q15(f,g11),ADD32(x1,x3))
 | 
				
			||||||
               + MULT16_32_Q15(MULT16_16_Q15(f,g12),ADD32(x0,x4));
 | 
					               + MULT16_32_Q15(MULT16_16_Q15(f,g12),ADD32(x0,x4));
 | 
				
			||||||
 | 
					      y[i] = SATURATE(y[i], SIG_SAT);
 | 
				
			||||||
      x4=x3;
 | 
					      x4=x3;
 | 
				
			||||||
      x3=x2;
 | 
					      x3=x2;
 | 
				
			||||||
      x2=x1;
 | 
					      x2=x1;
 | 
				
			||||||
@@ -244,11 +256,16 @@ void comb_filter(opus_val32 *y, opus_val32 *x, int T0, int T1, int N,
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
#endif /* OVERRIDE_comb_filter */
 | 
					#endif /* OVERRIDE_comb_filter */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* TF change table. Positive values mean better frequency resolution (longer
 | 
				
			||||||
 | 
					   effective window), whereas negative values mean better time resolution
 | 
				
			||||||
 | 
					   (shorter effective window). The second index is computed as:
 | 
				
			||||||
 | 
					   4*isTransient + 2*tf_select + per_band_flag */
 | 
				
			||||||
const signed char tf_select_table[4][8] = {
 | 
					const signed char tf_select_table[4][8] = {
 | 
				
			||||||
      {0, -1, 0, -1,    0,-1, 0,-1},
 | 
					    /*isTransient=0     isTransient=1 */
 | 
				
			||||||
      {0, -1, 0, -2,    1, 0, 1,-1},
 | 
					      {0, -1, 0, -1,    0,-1, 0,-1}, /* 2.5 ms */
 | 
				
			||||||
      {0, -2, 0, -3,    2, 0, 1,-1},
 | 
					      {0, -1, 0, -2,    1, 0, 1,-1}, /* 5 ms */
 | 
				
			||||||
      {0, -2, 0, -3,    3, 0, 1,-1},
 | 
					      {0, -2, 0, -3,    2, 0, 1,-1}, /* 10 ms */
 | 
				
			||||||
 | 
					      {0, -2, 0, -3,    3, 0, 1,-1}, /* 20 ms */
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -50,6 +50,8 @@ extern "C" {
 | 
				
			|||||||
#define CELTDecoder OpusCustomDecoder
 | 
					#define CELTDecoder OpusCustomDecoder
 | 
				
			||||||
#define CELTMode OpusCustomMode
 | 
					#define CELTMode OpusCustomMode
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define LEAK_BANDS 19
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
   int valid;
 | 
					   int valid;
 | 
				
			||||||
   float tonality;
 | 
					   float tonality;
 | 
				
			||||||
@@ -57,17 +59,27 @@ typedef struct {
 | 
				
			|||||||
   float noisiness;
 | 
					   float noisiness;
 | 
				
			||||||
   float activity;
 | 
					   float activity;
 | 
				
			||||||
   float music_prob;
 | 
					   float music_prob;
 | 
				
			||||||
   int        bandwidth;
 | 
					   float music_prob_min;
 | 
				
			||||||
}AnalysisInfo;
 | 
					   float music_prob_max;
 | 
				
			||||||
 | 
					   int   bandwidth;
 | 
				
			||||||
 | 
					   float activity_probability;
 | 
				
			||||||
 | 
					   float max_pitch_ratio;
 | 
				
			||||||
 | 
					   /* Store as Q6 char to save space. */
 | 
				
			||||||
 | 
					   unsigned char leak_boost[LEAK_BANDS];
 | 
				
			||||||
 | 
					} AnalysisInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					   int signalType;
 | 
				
			||||||
 | 
					   int offset;
 | 
				
			||||||
 | 
					} SILKInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define __celt_check_mode_ptr_ptr(ptr) ((ptr) + ((ptr) - (const CELTMode**)(ptr)))
 | 
					#define __celt_check_mode_ptr_ptr(ptr) ((ptr) + ((ptr) - (const CELTMode**)(ptr)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define __celt_check_analysis_ptr(ptr) ((ptr) + ((ptr) - (const AnalysisInfo*)(ptr)))
 | 
					#define __celt_check_analysis_ptr(ptr) ((ptr) + ((ptr) - (const AnalysisInfo*)(ptr)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Encoder/decoder Requests */
 | 
					#define __celt_check_silkinfo_ptr(ptr) ((ptr) + ((ptr) - (const SILKInfo*)(ptr)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Expose this option again when variable framesize actually works */
 | 
					/* Encoder/decoder Requests */
 | 
				
			||||||
#define OPUS_FRAMESIZE_VARIABLE              5010 /**< Optimize the frame size dynamically */
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CELT_SET_PREDICTION_REQUEST    10002
 | 
					#define CELT_SET_PREDICTION_REQUEST    10002
 | 
				
			||||||
@@ -116,6 +128,9 @@ typedef struct {
 | 
				
			|||||||
#define OPUS_SET_ENERGY_MASK_REQUEST    10026
 | 
					#define OPUS_SET_ENERGY_MASK_REQUEST    10026
 | 
				
			||||||
#define OPUS_SET_ENERGY_MASK(x) OPUS_SET_ENERGY_MASK_REQUEST, __opus_check_val16_ptr(x)
 | 
					#define OPUS_SET_ENERGY_MASK(x) OPUS_SET_ENERGY_MASK_REQUEST, __opus_check_val16_ptr(x)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define CELT_SET_SILK_INFO_REQUEST    10028
 | 
				
			||||||
 | 
					#define CELT_SET_SILK_INFO(x) CELT_SET_SILK_INFO_REQUEST, __celt_check_silkinfo_ptr(x)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Encoder stuff */
 | 
					/* Encoder stuff */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int celt_encoder_get_size(int channels);
 | 
					int celt_encoder_get_size(int channels);
 | 
				
			||||||
@@ -194,6 +209,13 @@ static OPUS_INLINE int fromOpus(unsigned char c)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
extern const signed char tf_select_table[4][8];
 | 
					extern const signed char tf_select_table[4][8];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(ENABLE_HARDENING) || defined(ENABLE_ASSERTIONS)
 | 
				
			||||||
 | 
					void validate_celt_decoder(CELTDecoder *st);
 | 
				
			||||||
 | 
					#define VALIDATE_CELT_DECODER(st) validate_celt_decoder(st)
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define VALIDATE_CELT_DECODER(st)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int resampling_factor(opus_int32 rate);
 | 
					int resampling_factor(opus_int32 rate);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void celt_preemphasis(const opus_val16 * OPUS_RESTRICT pcmp, celt_sig * OPUS_RESTRICT inp,
 | 
					void celt_preemphasis(const opus_val16 * OPUS_RESTRICT pcmp, celt_sig * OPUS_RESTRICT inp,
 | 
				
			||||||
@@ -209,7 +231,7 @@ void comb_filter_const_c(opus_val32 *y, opus_val32 *x, int T, int N,
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef OVERRIDE_COMB_FILTER_CONST
 | 
					#ifndef OVERRIDE_COMB_FILTER_CONST
 | 
				
			||||||
# define comb_filter_const(y, x, T, N, g10, g11, g12, arch)		\
 | 
					# define comb_filter_const(y, x, T, N, g10, g11, g12, arch) \
 | 
				
			||||||
    ((void)(arch),comb_filter_const_c(y, x, T, N, g10, g11, g12))
 | 
					    ((void)(arch),comb_filter_const_c(y, x, T, N, g10, g11, g12))
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -51,6 +51,14 @@
 | 
				
			|||||||
#include "celt_lpc.h"
 | 
					#include "celt_lpc.h"
 | 
				
			||||||
#include "vq.h"
 | 
					#include "vq.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* The maximum pitch lag to allow in the pitch-based PLC. It's possible to save
 | 
				
			||||||
 | 
					   CPU time in the PLC pitch search by making this smaller than MAX_PERIOD. The
 | 
				
			||||||
 | 
					   current value corresponds to a pitch of 66.67 Hz. */
 | 
				
			||||||
 | 
					#define PLC_PITCH_LAG_MAX (720)
 | 
				
			||||||
 | 
					/* The minimum pitch lag to allow in the pitch-based PLC. This corresponds to a
 | 
				
			||||||
 | 
					   pitch of 480 Hz. */
 | 
				
			||||||
 | 
					#define PLC_PITCH_LAG_MIN (100)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(SMALL_FOOTPRINT) && defined(FIXED_POINT)
 | 
					#if defined(SMALL_FOOTPRINT) && defined(FIXED_POINT)
 | 
				
			||||||
#define NORM_ALIASING_HACK
 | 
					#define NORM_ALIASING_HACK
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
@@ -73,6 +81,7 @@ struct OpusCustomDecoder {
 | 
				
			|||||||
   int downsample;
 | 
					   int downsample;
 | 
				
			||||||
   int start, end;
 | 
					   int start, end;
 | 
				
			||||||
   int signalling;
 | 
					   int signalling;
 | 
				
			||||||
 | 
					   int disable_inv;
 | 
				
			||||||
   int arch;
 | 
					   int arch;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   /* Everything beyond this point gets cleared on a reset */
 | 
					   /* Everything beyond this point gets cleared on a reset */
 | 
				
			||||||
@@ -82,6 +91,7 @@ struct OpusCustomDecoder {
 | 
				
			|||||||
   int error;
 | 
					   int error;
 | 
				
			||||||
   int last_pitch_index;
 | 
					   int last_pitch_index;
 | 
				
			||||||
   int loss_count;
 | 
					   int loss_count;
 | 
				
			||||||
 | 
					   int skip_plc;
 | 
				
			||||||
   int postfilter_period;
 | 
					   int postfilter_period;
 | 
				
			||||||
   int postfilter_period_old;
 | 
					   int postfilter_period_old;
 | 
				
			||||||
   opus_val16 postfilter_gain;
 | 
					   opus_val16 postfilter_gain;
 | 
				
			||||||
@@ -99,6 +109,38 @@ struct OpusCustomDecoder {
 | 
				
			|||||||
   /* opus_val16 backgroundLogE[], Size = 2*mode->nbEBands */
 | 
					   /* opus_val16 backgroundLogE[], Size = 2*mode->nbEBands */
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(ENABLE_HARDENING) || defined(ENABLE_ASSERTIONS)
 | 
				
			||||||
 | 
					/* Make basic checks on the CELT state to ensure we don't end
 | 
				
			||||||
 | 
					   up writing all over memory. */
 | 
				
			||||||
 | 
					void validate_celt_decoder(CELTDecoder *st)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifndef CUSTOM_MODES
 | 
				
			||||||
 | 
					   celt_assert(st->mode == opus_custom_mode_create(48000, 960, NULL));
 | 
				
			||||||
 | 
					   celt_assert(st->overlap == 120);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					   celt_assert(st->channels == 1 || st->channels == 2);
 | 
				
			||||||
 | 
					   celt_assert(st->stream_channels == 1 || st->stream_channels == 2);
 | 
				
			||||||
 | 
					   celt_assert(st->downsample > 0);
 | 
				
			||||||
 | 
					   celt_assert(st->start == 0 || st->start == 17);
 | 
				
			||||||
 | 
					   celt_assert(st->start < st->end);
 | 
				
			||||||
 | 
					   celt_assert(st->end <= 21);
 | 
				
			||||||
 | 
					#ifdef OPUS_ARCHMASK
 | 
				
			||||||
 | 
					   celt_assert(st->arch >= 0);
 | 
				
			||||||
 | 
					   celt_assert(st->arch <= OPUS_ARCHMASK);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					   celt_assert(st->last_pitch_index <= PLC_PITCH_LAG_MAX);
 | 
				
			||||||
 | 
					   celt_assert(st->last_pitch_index >= PLC_PITCH_LAG_MIN || st->last_pitch_index == 0);
 | 
				
			||||||
 | 
					   celt_assert(st->postfilter_period < MAX_PERIOD);
 | 
				
			||||||
 | 
					   celt_assert(st->postfilter_period >= COMBFILTER_MINPERIOD || st->postfilter_period == 0);
 | 
				
			||||||
 | 
					   celt_assert(st->postfilter_period_old < MAX_PERIOD);
 | 
				
			||||||
 | 
					   celt_assert(st->postfilter_period_old >= COMBFILTER_MINPERIOD || st->postfilter_period_old == 0);
 | 
				
			||||||
 | 
					   celt_assert(st->postfilter_tapset <= 2);
 | 
				
			||||||
 | 
					   celt_assert(st->postfilter_tapset >= 0);
 | 
				
			||||||
 | 
					   celt_assert(st->postfilter_tapset_old <= 2);
 | 
				
			||||||
 | 
					   celt_assert(st->postfilter_tapset_old >= 0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int celt_decoder_get_size(int channels)
 | 
					int celt_decoder_get_size(int channels)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   const CELTMode *mode = opus_custom_mode_create(48000, 960, NULL);
 | 
					   const CELTMode *mode = opus_custom_mode_create(48000, 960, NULL);
 | 
				
			||||||
@@ -162,10 +204,13 @@ OPUS_CUSTOM_NOSTATIC int opus_custom_decoder_init(CELTDecoder *st, const CELTMod
 | 
				
			|||||||
   st->start = 0;
 | 
					   st->start = 0;
 | 
				
			||||||
   st->end = st->mode->effEBands;
 | 
					   st->end = st->mode->effEBands;
 | 
				
			||||||
   st->signalling = 1;
 | 
					   st->signalling = 1;
 | 
				
			||||||
 | 
					#ifndef DISABLE_UPDATE_DRAFT
 | 
				
			||||||
 | 
					   st->disable_inv = channels == 1;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					   st->disable_inv = 0;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
   st->arch = opus_select_arch();
 | 
					   st->arch = opus_select_arch();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   st->loss_count = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   opus_custom_decoder_ctl(st, OPUS_RESET_STATE);
 | 
					   opus_custom_decoder_ctl(st, OPUS_RESET_STATE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   return OPUS_OK;
 | 
					   return OPUS_OK;
 | 
				
			||||||
@@ -178,6 +223,36 @@ void opus_custom_decoder_destroy(CELTDecoder *st)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
#endif /* CUSTOM_MODES */
 | 
					#endif /* CUSTOM_MODES */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef CUSTOM_MODES
 | 
				
			||||||
 | 
					/* Special case for stereo with no downsampling and no accumulation. This is
 | 
				
			||||||
 | 
					   quite common and we can make it faster by processing both channels in the
 | 
				
			||||||
 | 
					   same loop, reducing overhead due to the dependency loop in the IIR filter. */
 | 
				
			||||||
 | 
					static void deemphasis_stereo_simple(celt_sig *in[], opus_val16 *pcm, int N, const opus_val16 coef0,
 | 
				
			||||||
 | 
					      celt_sig *mem)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					   celt_sig * OPUS_RESTRICT x0;
 | 
				
			||||||
 | 
					   celt_sig * OPUS_RESTRICT x1;
 | 
				
			||||||
 | 
					   celt_sig m0, m1;
 | 
				
			||||||
 | 
					   int j;
 | 
				
			||||||
 | 
					   x0=in[0];
 | 
				
			||||||
 | 
					   x1=in[1];
 | 
				
			||||||
 | 
					   m0 = mem[0];
 | 
				
			||||||
 | 
					   m1 = mem[1];
 | 
				
			||||||
 | 
					   for (j=0;j<N;j++)
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					      celt_sig tmp0, tmp1;
 | 
				
			||||||
 | 
					      /* Add VERY_SMALL to x[] first to reduce dependency chain. */
 | 
				
			||||||
 | 
					      tmp0 = x0[j] + VERY_SMALL + m0;
 | 
				
			||||||
 | 
					      tmp1 = x1[j] + VERY_SMALL + m1;
 | 
				
			||||||
 | 
					      m0 = MULT16_32_Q15(coef0, tmp0);
 | 
				
			||||||
 | 
					      m1 = MULT16_32_Q15(coef0, tmp1);
 | 
				
			||||||
 | 
					      pcm[2*j  ] = SCALEOUT(SIG2WORD16(tmp0));
 | 
				
			||||||
 | 
					      pcm[2*j+1] = SCALEOUT(SIG2WORD16(tmp1));
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					   mem[0] = m0;
 | 
				
			||||||
 | 
					   mem[1] = m1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef RESYNTH
 | 
					#ifndef RESYNTH
 | 
				
			||||||
static
 | 
					static
 | 
				
			||||||
@@ -191,6 +266,14 @@ void deemphasis(celt_sig *in[], opus_val16 *pcm, int N, int C, int downsample, c
 | 
				
			|||||||
   opus_val16 coef0;
 | 
					   opus_val16 coef0;
 | 
				
			||||||
   VARDECL(celt_sig, scratch);
 | 
					   VARDECL(celt_sig, scratch);
 | 
				
			||||||
   SAVE_STACK;
 | 
					   SAVE_STACK;
 | 
				
			||||||
 | 
					#ifndef CUSTOM_MODES
 | 
				
			||||||
 | 
					   /* Short version for common case. */
 | 
				
			||||||
 | 
					   if (downsample == 1 && C == 2 && !accum)
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					      deemphasis_stereo_simple(in, pcm, N, coef[0], mem);
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
#ifndef FIXED_POINT
 | 
					#ifndef FIXED_POINT
 | 
				
			||||||
   (void)accum;
 | 
					   (void)accum;
 | 
				
			||||||
   celt_assert(accum==0);
 | 
					   celt_assert(accum==0);
 | 
				
			||||||
@@ -226,7 +309,7 @@ void deemphasis(celt_sig *in[], opus_val16 *pcm, int N, int C, int downsample, c
 | 
				
			|||||||
         /* Shortcut for the standard (non-custom modes) case */
 | 
					         /* Shortcut for the standard (non-custom modes) case */
 | 
				
			||||||
         for (j=0;j<N;j++)
 | 
					         for (j=0;j<N;j++)
 | 
				
			||||||
         {
 | 
					         {
 | 
				
			||||||
            celt_sig tmp = x[j] + m + VERY_SMALL;
 | 
					            celt_sig tmp = x[j] + VERY_SMALL + m;
 | 
				
			||||||
            m = MULT16_32_Q15(coef0, tmp);
 | 
					            m = MULT16_32_Q15(coef0, tmp);
 | 
				
			||||||
            scratch[j] = tmp;
 | 
					            scratch[j] = tmp;
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
@@ -247,7 +330,7 @@ void deemphasis(celt_sig *in[], opus_val16 *pcm, int N, int C, int downsample, c
 | 
				
			|||||||
         {
 | 
					         {
 | 
				
			||||||
            for (j=0;j<N;j++)
 | 
					            for (j=0;j<N;j++)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
               celt_sig tmp = x[j] + m + VERY_SMALL;
 | 
					               celt_sig tmp = x[j] + VERY_SMALL + m;
 | 
				
			||||||
               m = MULT16_32_Q15(coef0, tmp);
 | 
					               m = MULT16_32_Q15(coef0, tmp);
 | 
				
			||||||
               y[j*C] = SCALEOUT(SIG2WORD16(tmp));
 | 
					               y[j*C] = SCALEOUT(SIG2WORD16(tmp));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -334,7 +417,7 @@ void celt_synthesis(const CELTMode *mode, celt_norm *X, celt_sig * out_syn[],
 | 
				
			|||||||
      denormalise_bands(mode, X+N, freq2, oldBandE+nbEBands, start, effEnd, M,
 | 
					      denormalise_bands(mode, X+N, freq2, oldBandE+nbEBands, start, effEnd, M,
 | 
				
			||||||
            downsample, silence);
 | 
					            downsample, silence);
 | 
				
			||||||
      for (i=0;i<N;i++)
 | 
					      for (i=0;i<N;i++)
 | 
				
			||||||
         freq[i] = HALF32(ADD32(freq[i],freq2[i]));
 | 
					         freq[i] = ADD32(HALF32(freq[i]), HALF32(freq2[i]));
 | 
				
			||||||
      for (b=0;b<B;b++)
 | 
					      for (b=0;b<B;b++)
 | 
				
			||||||
         clt_mdct_backward(&mode->mdct, &freq[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch);
 | 
					         clt_mdct_backward(&mode->mdct, &freq[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch);
 | 
				
			||||||
   } else {
 | 
					   } else {
 | 
				
			||||||
@@ -346,6 +429,12 @@ void celt_synthesis(const CELTMode *mode, celt_norm *X, celt_sig * out_syn[],
 | 
				
			|||||||
            clt_mdct_backward(&mode->mdct, &freq[b], out_syn[c]+NB*b, mode->window, overlap, shift, B, arch);
 | 
					            clt_mdct_backward(&mode->mdct, &freq[b], out_syn[c]+NB*b, mode->window, overlap, shift, B, arch);
 | 
				
			||||||
      } while (++c<CC);
 | 
					      } while (++c<CC);
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 | 
					   /* Saturate IMDCT output so that we can't overflow in the pitch postfilter
 | 
				
			||||||
 | 
					      or in the */
 | 
				
			||||||
 | 
					   c=0; do {
 | 
				
			||||||
 | 
					      for (i=0;i<N;i++)
 | 
				
			||||||
 | 
					         out_syn[c][i] = SATURATE(out_syn[c][i], SIG_SAT);
 | 
				
			||||||
 | 
					   } while (++c<CC);
 | 
				
			||||||
   RESTORE_STACK;
 | 
					   RESTORE_STACK;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -388,14 +477,6 @@ static void tf_decode(int start, int end, int isTransient, int *tf_res, int LM,
 | 
				
			|||||||
   }
 | 
					   }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* The maximum pitch lag to allow in the pitch-based PLC. It's possible to save
 | 
					 | 
				
			||||||
   CPU time in the PLC pitch search by making this smaller than MAX_PERIOD. The
 | 
					 | 
				
			||||||
   current value corresponds to a pitch of 66.67 Hz. */
 | 
					 | 
				
			||||||
#define PLC_PITCH_LAG_MAX (720)
 | 
					 | 
				
			||||||
/* The minimum pitch lag to allow in the pitch-based PLC. This corresponds to a
 | 
					 | 
				
			||||||
   pitch of 480 Hz. */
 | 
					 | 
				
			||||||
#define PLC_PITCH_LAG_MIN (100)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static int celt_plc_pitch_search(celt_sig *decode_mem[2], int C, int arch)
 | 
					static int celt_plc_pitch_search(celt_sig *decode_mem[2], int C, int arch)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   int pitch_index;
 | 
					   int pitch_index;
 | 
				
			||||||
@@ -447,7 +528,7 @@ static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
   loss_count = st->loss_count;
 | 
					   loss_count = st->loss_count;
 | 
				
			||||||
   start = st->start;
 | 
					   start = st->start;
 | 
				
			||||||
   noise_based = loss_count >= 5 || start != 0;
 | 
					   noise_based = loss_count >= 5 || start != 0 || st->skip_plc;
 | 
				
			||||||
   if (noise_based)
 | 
					   if (noise_based)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
      /* Noise-based PLC/CNG */
 | 
					      /* Noise-based PLC/CNG */
 | 
				
			||||||
@@ -505,12 +586,15 @@ static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      celt_synthesis(mode, X, out_syn, oldBandE, start, effEnd, C, C, 0, LM, st->downsample, 0, st->arch);
 | 
					      celt_synthesis(mode, X, out_syn, oldBandE, start, effEnd, C, C, 0, LM, st->downsample, 0, st->arch);
 | 
				
			||||||
   } else {
 | 
					   } else {
 | 
				
			||||||
 | 
					      int exc_length;
 | 
				
			||||||
      /* Pitch-based PLC */
 | 
					      /* Pitch-based PLC */
 | 
				
			||||||
      const opus_val16 *window;
 | 
					      const opus_val16 *window;
 | 
				
			||||||
 | 
					      opus_val16 *exc;
 | 
				
			||||||
      opus_val16 fade = Q15ONE;
 | 
					      opus_val16 fade = Q15ONE;
 | 
				
			||||||
      int pitch_index;
 | 
					      int pitch_index;
 | 
				
			||||||
      VARDECL(opus_val32, etmp);
 | 
					      VARDECL(opus_val32, etmp);
 | 
				
			||||||
      VARDECL(opus_val16, exc);
 | 
					      VARDECL(opus_val16, _exc);
 | 
				
			||||||
 | 
					      VARDECL(opus_val16, fir_tmp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (loss_count == 0)
 | 
					      if (loss_count == 0)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
@@ -520,8 +604,14 @@ static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM)
 | 
				
			|||||||
         fade = QCONST16(.8f,15);
 | 
					         fade = QCONST16(.8f,15);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      /* We want the excitation for 2 pitch periods in order to look for a
 | 
				
			||||||
 | 
					         decaying signal, but we can't get more than MAX_PERIOD. */
 | 
				
			||||||
 | 
					      exc_length = IMIN(2*pitch_index, MAX_PERIOD);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      ALLOC(etmp, overlap, opus_val32);
 | 
					      ALLOC(etmp, overlap, opus_val32);
 | 
				
			||||||
      ALLOC(exc, MAX_PERIOD, opus_val16);
 | 
					      ALLOC(_exc, MAX_PERIOD+LPC_ORDER, opus_val16);
 | 
				
			||||||
 | 
					      ALLOC(fir_tmp, exc_length, opus_val16);
 | 
				
			||||||
 | 
					      exc = _exc+LPC_ORDER;
 | 
				
			||||||
      window = mode->window;
 | 
					      window = mode->window;
 | 
				
			||||||
      c=0; do {
 | 
					      c=0; do {
 | 
				
			||||||
         opus_val16 decay;
 | 
					         opus_val16 decay;
 | 
				
			||||||
@@ -530,13 +620,11 @@ static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM)
 | 
				
			|||||||
         celt_sig *buf;
 | 
					         celt_sig *buf;
 | 
				
			||||||
         int extrapolation_offset;
 | 
					         int extrapolation_offset;
 | 
				
			||||||
         int extrapolation_len;
 | 
					         int extrapolation_len;
 | 
				
			||||||
         int exc_length;
 | 
					 | 
				
			||||||
         int j;
 | 
					         int j;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         buf = decode_mem[c];
 | 
					         buf = decode_mem[c];
 | 
				
			||||||
         for (i=0;i<MAX_PERIOD;i++) {
 | 
					         for (i=0;i<MAX_PERIOD+LPC_ORDER;i++)
 | 
				
			||||||
            exc[i] = ROUND16(buf[DECODE_BUFFER_SIZE-MAX_PERIOD+i], SIG_SHIFT);
 | 
					            exc[i-LPC_ORDER] = ROUND16(buf[DECODE_BUFFER_SIZE-MAX_PERIOD-LPC_ORDER+i], SIG_SHIFT);
 | 
				
			||||||
         }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
         if (loss_count == 0)
 | 
					         if (loss_count == 0)
 | 
				
			||||||
         {
 | 
					         {
 | 
				
			||||||
@@ -562,22 +650,32 @@ static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM)
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            _celt_lpc(lpc+c*LPC_ORDER, ac, LPC_ORDER);
 | 
					            _celt_lpc(lpc+c*LPC_ORDER, ac, LPC_ORDER);
 | 
				
			||||||
 | 
					#ifdef FIXED_POINT
 | 
				
			||||||
 | 
					         /* For fixed-point, apply bandwidth expansion until we can guarantee that
 | 
				
			||||||
 | 
					            no overflow can happen in the IIR filter. This means:
 | 
				
			||||||
 | 
					            32768*sum(abs(filter)) < 2^31 */
 | 
				
			||||||
 | 
					         while (1) {
 | 
				
			||||||
 | 
					            opus_val16 tmp=Q15ONE;
 | 
				
			||||||
 | 
					            opus_val32 sum=QCONST16(1., SIG_SHIFT);
 | 
				
			||||||
 | 
					            for (i=0;i<LPC_ORDER;i++)
 | 
				
			||||||
 | 
					               sum += ABS16(lpc[c*LPC_ORDER+i]);
 | 
				
			||||||
 | 
					            if (sum < 65535) break;
 | 
				
			||||||
 | 
					            for (i=0;i<LPC_ORDER;i++)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					               tmp = MULT16_16_Q15(QCONST16(.99f,15), tmp);
 | 
				
			||||||
 | 
					               lpc[c*LPC_ORDER+i] = MULT16_16_Q15(lpc[c*LPC_ORDER+i], tmp);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
         /* We want the excitation for 2 pitch periods in order to look for a
 | 
					 | 
				
			||||||
            decaying signal, but we can't get more than MAX_PERIOD. */
 | 
					 | 
				
			||||||
         exc_length = IMIN(2*pitch_index, MAX_PERIOD);
 | 
					 | 
				
			||||||
         /* Initialize the LPC history with the samples just before the start
 | 
					         /* Initialize the LPC history with the samples just before the start
 | 
				
			||||||
            of the region for which we're computing the excitation. */
 | 
					            of the region for which we're computing the excitation. */
 | 
				
			||||||
         {
 | 
					         {
 | 
				
			||||||
            opus_val16 lpc_mem[LPC_ORDER];
 | 
					            /* Compute the excitation for exc_length samples before the loss. We need the copy
 | 
				
			||||||
            for (i=0;i<LPC_ORDER;i++)
 | 
					               because celt_fir() cannot filter in-place. */
 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
               lpc_mem[i] =
 | 
					 | 
				
			||||||
                     ROUND16(buf[DECODE_BUFFER_SIZE-exc_length-1-i], SIG_SHIFT);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            /* Compute the excitation for exc_length samples before the loss. */
 | 
					 | 
				
			||||||
            celt_fir(exc+MAX_PERIOD-exc_length, lpc+c*LPC_ORDER,
 | 
					            celt_fir(exc+MAX_PERIOD-exc_length, lpc+c*LPC_ORDER,
 | 
				
			||||||
                  exc+MAX_PERIOD-exc_length, exc_length, LPC_ORDER, lpc_mem, st->arch);
 | 
					                  fir_tmp, exc_length, LPC_ORDER, st->arch);
 | 
				
			||||||
 | 
					            OPUS_COPY(exc+MAX_PERIOD-exc_length, fir_tmp, exc_length);
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         /* Check if the waveform is decaying, and if so how fast.
 | 
					         /* Check if the waveform is decaying, and if so how fast.
 | 
				
			||||||
@@ -631,9 +729,8 @@ static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM)
 | 
				
			|||||||
            tmp = ROUND16(
 | 
					            tmp = ROUND16(
 | 
				
			||||||
                  buf[DECODE_BUFFER_SIZE-MAX_PERIOD-N+extrapolation_offset+j],
 | 
					                  buf[DECODE_BUFFER_SIZE-MAX_PERIOD-N+extrapolation_offset+j],
 | 
				
			||||||
                  SIG_SHIFT);
 | 
					                  SIG_SHIFT);
 | 
				
			||||||
            S1 += SHR32(MULT16_16(tmp, tmp), 8);
 | 
					            S1 += SHR32(MULT16_16(tmp, tmp), 10);
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
 | 
					 | 
				
			||||||
         {
 | 
					         {
 | 
				
			||||||
            opus_val16 lpc_mem[LPC_ORDER];
 | 
					            opus_val16 lpc_mem[LPC_ORDER];
 | 
				
			||||||
            /* Copy the last decoded samples (prior to the overlap region) to
 | 
					            /* Copy the last decoded samples (prior to the overlap region) to
 | 
				
			||||||
@@ -645,6 +742,10 @@ static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM)
 | 
				
			|||||||
            celt_iir(buf+DECODE_BUFFER_SIZE-N, lpc+c*LPC_ORDER,
 | 
					            celt_iir(buf+DECODE_BUFFER_SIZE-N, lpc+c*LPC_ORDER,
 | 
				
			||||||
                  buf+DECODE_BUFFER_SIZE-N, extrapolation_len, LPC_ORDER,
 | 
					                  buf+DECODE_BUFFER_SIZE-N, extrapolation_len, LPC_ORDER,
 | 
				
			||||||
                  lpc_mem, st->arch);
 | 
					                  lpc_mem, st->arch);
 | 
				
			||||||
 | 
					#ifdef FIXED_POINT
 | 
				
			||||||
 | 
					            for (i=0; i < extrapolation_len; i++)
 | 
				
			||||||
 | 
					               buf[DECODE_BUFFER_SIZE-N+i] = SATURATE(buf[DECODE_BUFFER_SIZE-N+i], SIG_SAT);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         /* Check if the synthesis energy is higher than expected, which can
 | 
					         /* Check if the synthesis energy is higher than expected, which can
 | 
				
			||||||
@@ -655,7 +756,7 @@ static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM)
 | 
				
			|||||||
            for (i=0;i<extrapolation_len;i++)
 | 
					            for (i=0;i<extrapolation_len;i++)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
               opus_val16 tmp = ROUND16(buf[DECODE_BUFFER_SIZE-N+i], SIG_SHIFT);
 | 
					               opus_val16 tmp = ROUND16(buf[DECODE_BUFFER_SIZE-N+i], SIG_SHIFT);
 | 
				
			||||||
               S2 += SHR32(MULT16_16(tmp, tmp), 8);
 | 
					               S2 += SHR32(MULT16_16(tmp, tmp), 10);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            /* This checks for an "explosion" in the synthesis. */
 | 
					            /* This checks for an "explosion" in the synthesis. */
 | 
				
			||||||
#ifdef FIXED_POINT
 | 
					#ifdef FIXED_POINT
 | 
				
			||||||
@@ -763,6 +864,7 @@ int celt_decode_with_ec(CELTDecoder * OPUS_RESTRICT st, const unsigned char *dat
 | 
				
			|||||||
   const opus_int16 *eBands;
 | 
					   const opus_int16 *eBands;
 | 
				
			||||||
   ALLOC_STACK;
 | 
					   ALLOC_STACK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   VALIDATE_CELT_DECODER(st);
 | 
				
			||||||
   mode = st->mode;
 | 
					   mode = st->mode;
 | 
				
			||||||
   nbEBands = mode->nbEBands;
 | 
					   nbEBands = mode->nbEBands;
 | 
				
			||||||
   overlap = mode->overlap;
 | 
					   overlap = mode->overlap;
 | 
				
			||||||
@@ -832,6 +934,10 @@ int celt_decode_with_ec(CELTDecoder * OPUS_RESTRICT st, const unsigned char *dat
 | 
				
			|||||||
      return frame_size/st->downsample;
 | 
					      return frame_size/st->downsample;
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   /* Check if there are at least two packets received consecutively before
 | 
				
			||||||
 | 
					    * turning on the pitch-based PLC */
 | 
				
			||||||
 | 
					   st->skip_plc = st->loss_count != 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   if (dec == NULL)
 | 
					   if (dec == NULL)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
      ec_dec_init(&_dec,(unsigned char*)data,len);
 | 
					      ec_dec_init(&_dec,(unsigned char*)data,len);
 | 
				
			||||||
@@ -953,7 +1059,7 @@ int celt_decode_with_ec(CELTDecoder * OPUS_RESTRICT st, const unsigned char *dat
 | 
				
			|||||||
   ALLOC(pulses, nbEBands, int);
 | 
					   ALLOC(pulses, nbEBands, int);
 | 
				
			||||||
   ALLOC(fine_priority, nbEBands, int);
 | 
					   ALLOC(fine_priority, nbEBands, int);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   codedBands = compute_allocation(mode, start, end, offsets, cap,
 | 
					   codedBands = clt_compute_allocation(mode, start, end, offsets, cap,
 | 
				
			||||||
         alloc_trim, &intensity, &dual_stereo, bits, &balance, pulses,
 | 
					         alloc_trim, &intensity, &dual_stereo, bits, &balance, pulses,
 | 
				
			||||||
         fine_quant, fine_priority, C, LM, dec, 0, 0, 0);
 | 
					         fine_quant, fine_priority, C, LM, dec, 0, 0, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -976,7 +1082,8 @@ int celt_decode_with_ec(CELTDecoder * OPUS_RESTRICT st, const unsigned char *dat
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
   quant_all_bands(0, mode, start, end, X, C==2 ? X+N : NULL, collapse_masks,
 | 
					   quant_all_bands(0, mode, start, end, X, C==2 ? X+N : NULL, collapse_masks,
 | 
				
			||||||
         NULL, pulses, shortBlocks, spread_decision, dual_stereo, intensity, tf_res,
 | 
					         NULL, pulses, shortBlocks, spread_decision, dual_stereo, intensity, tf_res,
 | 
				
			||||||
         len*(8<<BITRES)-anti_collapse_rsv, balance, dec, LM, codedBands, &st->rng, st->arch);
 | 
					         len*(8<<BITRES)-anti_collapse_rsv, balance, dec, LM, codedBands, &st->rng, 0,
 | 
				
			||||||
 | 
					         st->arch, st->disable_inv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   if (anti_collapse_rsv > 0)
 | 
					   if (anti_collapse_rsv > 0)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
@@ -1198,6 +1305,7 @@ int opus_custom_decoder_ctl(CELTDecoder * OPUS_RESTRICT st, int request, ...)
 | 
				
			|||||||
               ((char*)&st->DECODER_RESET_START - (char*)st));
 | 
					               ((char*)&st->DECODER_RESET_START - (char*)st));
 | 
				
			||||||
         for (i=0;i<2*st->mode->nbEBands;i++)
 | 
					         for (i=0;i<2*st->mode->nbEBands;i++)
 | 
				
			||||||
            oldLogE[i]=oldLogE2[i]=-QCONST16(28.f,DB_SHIFT);
 | 
					            oldLogE[i]=oldLogE2[i]=-QCONST16(28.f,DB_SHIFT);
 | 
				
			||||||
 | 
					         st->skip_plc = 1;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
      case OPUS_GET_PITCH_REQUEST:
 | 
					      case OPUS_GET_PITCH_REQUEST:
 | 
				
			||||||
@@ -1230,6 +1338,26 @@ int opus_custom_decoder_ctl(CELTDecoder * OPUS_RESTRICT st, int request, ...)
 | 
				
			|||||||
         *value=st->rng;
 | 
					         *value=st->rng;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
 | 
					      case OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST:
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					          opus_int32 value = va_arg(ap, opus_int32);
 | 
				
			||||||
 | 
					          if(value<0 || value>1)
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					             goto bad_arg;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          st->disable_inv = value;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					      case OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST:
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					          opus_int32 *value = va_arg(ap, opus_int32*);
 | 
				
			||||||
 | 
					          if (!value)
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					             goto bad_arg;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          *value = st->disable_inv;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
      default:
 | 
					      default:
 | 
				
			||||||
         goto bad_request;
 | 
					         goto bad_request;
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
@@ -73,8 +73,8 @@ struct OpusCustomEncoder {
 | 
				
			|||||||
   int constrained_vbr;      /* If zero, VBR can do whatever it likes with the rate */
 | 
					   int constrained_vbr;      /* If zero, VBR can do whatever it likes with the rate */
 | 
				
			||||||
   int loss_rate;
 | 
					   int loss_rate;
 | 
				
			||||||
   int lsb_depth;
 | 
					   int lsb_depth;
 | 
				
			||||||
   int variable_duration;
 | 
					 | 
				
			||||||
   int lfe;
 | 
					   int lfe;
 | 
				
			||||||
 | 
					   int disable_inv;
 | 
				
			||||||
   int arch;
 | 
					   int arch;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   /* Everything beyond this point gets cleared on a reset */
 | 
					   /* Everything beyond this point gets cleared on a reset */
 | 
				
			||||||
@@ -98,6 +98,7 @@ struct OpusCustomEncoder {
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
   int consec_transient;
 | 
					   int consec_transient;
 | 
				
			||||||
   AnalysisInfo analysis;
 | 
					   AnalysisInfo analysis;
 | 
				
			||||||
 | 
					   SILKInfo silk_info;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   opus_val32 preemph_memE[2];
 | 
					   opus_val32 preemph_memE[2];
 | 
				
			||||||
   opus_val32 preemph_memD[2];
 | 
					   opus_val32 preemph_memD[2];
 | 
				
			||||||
@@ -123,6 +124,7 @@ struct OpusCustomEncoder {
 | 
				
			|||||||
   /* opus_val16 oldBandE[],     Size = channels*mode->nbEBands */
 | 
					   /* opus_val16 oldBandE[],     Size = channels*mode->nbEBands */
 | 
				
			||||||
   /* opus_val16 oldLogE[],      Size = channels*mode->nbEBands */
 | 
					   /* opus_val16 oldLogE[],      Size = channels*mode->nbEBands */
 | 
				
			||||||
   /* opus_val16 oldLogE2[],     Size = channels*mode->nbEBands */
 | 
					   /* opus_val16 oldLogE2[],     Size = channels*mode->nbEBands */
 | 
				
			||||||
 | 
					   /* opus_val16 energyError[],  Size = channels*mode->nbEBands */
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int celt_encoder_get_size(int channels)
 | 
					int celt_encoder_get_size(int channels)
 | 
				
			||||||
@@ -136,9 +138,10 @@ OPUS_CUSTOM_NOSTATIC int opus_custom_encoder_get_size(const CELTMode *mode, int
 | 
				
			|||||||
   int size = sizeof(struct CELTEncoder)
 | 
					   int size = sizeof(struct CELTEncoder)
 | 
				
			||||||
         + (channels*mode->overlap-1)*sizeof(celt_sig)    /* celt_sig in_mem[channels*mode->overlap]; */
 | 
					         + (channels*mode->overlap-1)*sizeof(celt_sig)    /* celt_sig in_mem[channels*mode->overlap]; */
 | 
				
			||||||
         + channels*COMBFILTER_MAXPERIOD*sizeof(celt_sig) /* celt_sig prefilter_mem[channels*COMBFILTER_MAXPERIOD]; */
 | 
					         + channels*COMBFILTER_MAXPERIOD*sizeof(celt_sig) /* celt_sig prefilter_mem[channels*COMBFILTER_MAXPERIOD]; */
 | 
				
			||||||
         + 3*channels*mode->nbEBands*sizeof(opus_val16);  /* opus_val16 oldBandE[channels*mode->nbEBands]; */
 | 
					         + 4*channels*mode->nbEBands*sizeof(opus_val16);  /* opus_val16 oldBandE[channels*mode->nbEBands]; */
 | 
				
			||||||
                                                          /* opus_val16 oldLogE[channels*mode->nbEBands]; */
 | 
					                                                          /* opus_val16 oldLogE[channels*mode->nbEBands]; */
 | 
				
			||||||
                                                          /* opus_val16 oldLogE2[channels*mode->nbEBands]; */
 | 
					                                                          /* opus_val16 oldLogE2[channels*mode->nbEBands]; */
 | 
				
			||||||
 | 
					                                                          /* opus_val16 energyError[channels*mode->nbEBands]; */
 | 
				
			||||||
   return size;
 | 
					   return size;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -178,7 +181,6 @@ static int opus_custom_encoder_init_arch(CELTEncoder *st, const CELTMode *mode,
 | 
				
			|||||||
   st->start = 0;
 | 
					   st->start = 0;
 | 
				
			||||||
   st->end = st->mode->effEBands;
 | 
					   st->end = st->mode->effEBands;
 | 
				
			||||||
   st->signalling = 1;
 | 
					   st->signalling = 1;
 | 
				
			||||||
 | 
					 | 
				
			||||||
   st->arch = arch;
 | 
					   st->arch = arch;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   st->constrained_vbr = 1;
 | 
					   st->constrained_vbr = 1;
 | 
				
			||||||
@@ -223,7 +225,8 @@ void opus_custom_encoder_destroy(CELTEncoder *st)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int C,
 | 
					static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int C,
 | 
				
			||||||
                              opus_val16 *tf_estimate, int *tf_chan)
 | 
					                              opus_val16 *tf_estimate, int *tf_chan, int allow_weak_transients,
 | 
				
			||||||
 | 
					                              int *weak_transient)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   int i;
 | 
					   int i;
 | 
				
			||||||
   VARDECL(opus_val16, tmp);
 | 
					   VARDECL(opus_val16, tmp);
 | 
				
			||||||
@@ -233,6 +236,12 @@ static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int
 | 
				
			|||||||
   int c;
 | 
					   int c;
 | 
				
			||||||
   opus_val16 tf_max;
 | 
					   opus_val16 tf_max;
 | 
				
			||||||
   int len2;
 | 
					   int len2;
 | 
				
			||||||
 | 
					   /* Forward masking: 6.7 dB/ms. */
 | 
				
			||||||
 | 
					#ifdef FIXED_POINT
 | 
				
			||||||
 | 
					   int forward_shift = 4;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					   opus_val16 forward_decay = QCONST16(.0625f,15);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
   /* Table of 6*64/x, trained on real data to minimize the average error */
 | 
					   /* Table of 6*64/x, trained on real data to minimize the average error */
 | 
				
			||||||
   static const unsigned char inv_table[128] = {
 | 
					   static const unsigned char inv_table[128] = {
 | 
				
			||||||
         255,255,156,110, 86, 70, 59, 51, 45, 40, 37, 33, 31, 28, 26, 25,
 | 
					         255,255,156,110, 86, 70, 59, 51, 45, 40, 37, 33, 31, 28, 26, 25,
 | 
				
			||||||
@@ -247,6 +256,19 @@ static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int
 | 
				
			|||||||
   SAVE_STACK;
 | 
					   SAVE_STACK;
 | 
				
			||||||
   ALLOC(tmp, len, opus_val16);
 | 
					   ALLOC(tmp, len, opus_val16);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   *weak_transient = 0;
 | 
				
			||||||
 | 
					   /* For lower bitrates, let's be more conservative and have a forward masking
 | 
				
			||||||
 | 
					      decay of 3.3 dB/ms. This avoids having to code transients at very low
 | 
				
			||||||
 | 
					      bitrate (mostly for hybrid), which can result in unstable energy and/or
 | 
				
			||||||
 | 
					      partial collapse. */
 | 
				
			||||||
 | 
					   if (allow_weak_transients)
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					#ifdef FIXED_POINT
 | 
				
			||||||
 | 
					      forward_shift = 5;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					      forward_decay = QCONST16(.03125f,15);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
   len2=len/2;
 | 
					   len2=len/2;
 | 
				
			||||||
   for (c=0;c<C;c++)
 | 
					   for (c=0;c<C;c++)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
@@ -269,7 +291,7 @@ static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int
 | 
				
			|||||||
         mem0 = mem1 + y - 2*x;
 | 
					         mem0 = mem1 + y - 2*x;
 | 
				
			||||||
         mem1 = x - .5f*y;
 | 
					         mem1 = x - .5f*y;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
         tmp[i] = EXTRACT16(SHR32(y,2));
 | 
					         tmp[i] = SROUND16(y, 2);
 | 
				
			||||||
         /*printf("%f ", tmp[i]);*/
 | 
					         /*printf("%f ", tmp[i]);*/
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      /*printf("\n");*/
 | 
					      /*printf("\n");*/
 | 
				
			||||||
@@ -280,7 +302,7 @@ static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int
 | 
				
			|||||||
      /* Normalize tmp to max range */
 | 
					      /* Normalize tmp to max range */
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
         int shift=0;
 | 
					         int shift=0;
 | 
				
			||||||
         shift = 14-celt_ilog2(1+celt_maxabs16(tmp, len));
 | 
					         shift = 14-celt_ilog2(MAX16(1, celt_maxabs16(tmp, len)));
 | 
				
			||||||
         if (shift!=0)
 | 
					         if (shift!=0)
 | 
				
			||||||
         {
 | 
					         {
 | 
				
			||||||
            for (i=0;i<len;i++)
 | 
					            for (i=0;i<len;i++)
 | 
				
			||||||
@@ -299,9 +321,9 @@ static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int
 | 
				
			|||||||
         mean += x2;
 | 
					         mean += x2;
 | 
				
			||||||
#ifdef FIXED_POINT
 | 
					#ifdef FIXED_POINT
 | 
				
			||||||
         /* FIXME: Use PSHR16() instead */
 | 
					         /* FIXME: Use PSHR16() instead */
 | 
				
			||||||
         tmp[i] = mem0 + PSHR32(x2-mem0,4);
 | 
					         tmp[i] = mem0 + PSHR32(x2-mem0,forward_shift);
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
         tmp[i] = mem0 + MULT16_16_P15(QCONST16(.0625f,15),x2-mem0);
 | 
					         tmp[i] = mem0 + MULT16_16_P15(forward_decay,x2-mem0);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
         mem0 = tmp[i];
 | 
					         mem0 = tmp[i];
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -311,6 +333,7 @@ static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int
 | 
				
			|||||||
      /* Backward pass to compute the pre-echo threshold */
 | 
					      /* Backward pass to compute the pre-echo threshold */
 | 
				
			||||||
      for (i=len2-1;i>=0;i--)
 | 
					      for (i=len2-1;i>=0;i--)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
 | 
					         /* Backward masking: 13.9 dB/ms. */
 | 
				
			||||||
#ifdef FIXED_POINT
 | 
					#ifdef FIXED_POINT
 | 
				
			||||||
         /* FIXME: Use PSHR16() instead */
 | 
					         /* FIXME: Use PSHR16() instead */
 | 
				
			||||||
         tmp[i] = mem0 + PSHR32(tmp[i]-mem0,3);
 | 
					         tmp[i] = mem0 + PSHR32(tmp[i]-mem0,3);
 | 
				
			||||||
@@ -339,6 +362,12 @@ static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int
 | 
				
			|||||||
      /* Compute harmonic mean discarding the unreliable boundaries
 | 
					      /* Compute harmonic mean discarding the unreliable boundaries
 | 
				
			||||||
         The data is smooth, so we only take 1/4th of the samples */
 | 
					         The data is smooth, so we only take 1/4th of the samples */
 | 
				
			||||||
      unmask=0;
 | 
					      unmask=0;
 | 
				
			||||||
 | 
					      /* We should never see NaNs here. If we find any, then something really bad happened and we better abort
 | 
				
			||||||
 | 
					         before it does any damage later on. If these asserts are disabled (no hardening), then the table
 | 
				
			||||||
 | 
					         lookup a few lines below (id = ...) is likely to crash dur to an out-of-bounds read. DO NOT FIX
 | 
				
			||||||
 | 
					         that crash on NaN since it could result in a worse issue later on. */
 | 
				
			||||||
 | 
					      celt_assert(!celt_isnan(tmp[0]));
 | 
				
			||||||
 | 
					      celt_assert(!celt_isnan(norm));
 | 
				
			||||||
      for (i=12;i<len2-5;i+=4)
 | 
					      for (i=12;i<len2-5;i+=4)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
         int id;
 | 
					         int id;
 | 
				
			||||||
@@ -359,7 +388,12 @@ static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
   is_transient = mask_metric>200;
 | 
					   is_transient = mask_metric>200;
 | 
				
			||||||
 | 
					   /* For low bitrates, define "weak transients" that need to be
 | 
				
			||||||
 | 
					      handled differently to avoid partial collapse. */
 | 
				
			||||||
 | 
					   if (allow_weak_transients && is_transient && mask_metric<600) {
 | 
				
			||||||
 | 
					      is_transient = 0;
 | 
				
			||||||
 | 
					      *weak_transient = 1;
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
   /* Arbitrary metric for VBR boost */
 | 
					   /* Arbitrary metric for VBR boost */
 | 
				
			||||||
   tf_max = MAX16(0,celt_sqrt(27*mask_metric)-42);
 | 
					   tf_max = MAX16(0,celt_sqrt(27*mask_metric)-42);
 | 
				
			||||||
   /* *tf_estimate = 1 + MIN16(1, sqrt(MAX16(0, tf_max-30))/20); */
 | 
					   /* *tf_estimate = 1 + MIN16(1, sqrt(MAX16(0, tf_max-30))/20); */
 | 
				
			||||||
@@ -549,7 +583,7 @@ static opus_val32 l1_metric(const celt_norm *tmp, int N, int LM, opus_val16 bias
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
static int tf_analysis(const CELTMode *m, int len, int isTransient,
 | 
					static int tf_analysis(const CELTMode *m, int len, int isTransient,
 | 
				
			||||||
      int *tf_res, int lambda, celt_norm *X, int N0, int LM,
 | 
					      int *tf_res, int lambda, celt_norm *X, int N0, int LM,
 | 
				
			||||||
      int *tf_sum, opus_val16 tf_estimate, int tf_chan)
 | 
					      opus_val16 tf_estimate, int tf_chan, int *importance)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   int i;
 | 
					   int i;
 | 
				
			||||||
   VARDECL(int, metric);
 | 
					   VARDECL(int, metric);
 | 
				
			||||||
@@ -574,7 +608,6 @@ static int tf_analysis(const CELTMode *m, int len, int isTransient,
 | 
				
			|||||||
   ALLOC(path0, len, int);
 | 
					   ALLOC(path0, len, int);
 | 
				
			||||||
   ALLOC(path1, len, int);
 | 
					   ALLOC(path1, len, int);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   *tf_sum = 0;
 | 
					 | 
				
			||||||
   for (i=0;i<len;i++)
 | 
					   for (i=0;i<len;i++)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
      int k, N;
 | 
					      int k, N;
 | 
				
			||||||
@@ -629,27 +662,26 @@ static int tf_analysis(const CELTMode *m, int len, int isTransient,
 | 
				
			|||||||
         metric[i] = 2*best_level;
 | 
					         metric[i] = 2*best_level;
 | 
				
			||||||
      else
 | 
					      else
 | 
				
			||||||
         metric[i] = -2*best_level;
 | 
					         metric[i] = -2*best_level;
 | 
				
			||||||
      *tf_sum += (isTransient ? LM : 0) - metric[i]/2;
 | 
					 | 
				
			||||||
      /* For bands that can't be split to -1, set the metric to the half-way point to avoid
 | 
					      /* For bands that can't be split to -1, set the metric to the half-way point to avoid
 | 
				
			||||||
         biasing the decision */
 | 
					         biasing the decision */
 | 
				
			||||||
      if (narrow && (metric[i]==0 || metric[i]==-2*LM))
 | 
					      if (narrow && (metric[i]==0 || metric[i]==-2*LM))
 | 
				
			||||||
         metric[i]-=1;
 | 
					         metric[i]-=1;
 | 
				
			||||||
      /*printf("%d ", metric[i]);*/
 | 
					      /*printf("%d ", metric[i]/2 + (!isTransient)*LM);*/
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
   /*printf("\n");*/
 | 
					   /*printf("\n");*/
 | 
				
			||||||
   /* Search for the optimal tf resolution, including tf_select */
 | 
					   /* Search for the optimal tf resolution, including tf_select */
 | 
				
			||||||
   tf_select = 0;
 | 
					   tf_select = 0;
 | 
				
			||||||
   for (sel=0;sel<2;sel++)
 | 
					   for (sel=0;sel<2;sel++)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
      cost0 = 0;
 | 
					      cost0 = importance[0]*abs(metric[0]-2*tf_select_table[LM][4*isTransient+2*sel+0]);
 | 
				
			||||||
      cost1 = isTransient ? 0 : lambda;
 | 
					      cost1 = importance[0]*abs(metric[0]-2*tf_select_table[LM][4*isTransient+2*sel+1]) + (isTransient ? 0 : lambda);
 | 
				
			||||||
      for (i=1;i<len;i++)
 | 
					      for (i=1;i<len;i++)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
         int curr0, curr1;
 | 
					         int curr0, curr1;
 | 
				
			||||||
         curr0 = IMIN(cost0, cost1 + lambda);
 | 
					         curr0 = IMIN(cost0, cost1 + lambda);
 | 
				
			||||||
         curr1 = IMIN(cost0 + lambda, cost1);
 | 
					         curr1 = IMIN(cost0 + lambda, cost1);
 | 
				
			||||||
         cost0 = curr0 + abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*sel+0]);
 | 
					         cost0 = curr0 + importance[i]*abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*sel+0]);
 | 
				
			||||||
         cost1 = curr1 + abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*sel+1]);
 | 
					         cost1 = curr1 + importance[i]*abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*sel+1]);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      cost0 = IMIN(cost0, cost1);
 | 
					      cost0 = IMIN(cost0, cost1);
 | 
				
			||||||
      selcost[sel]=cost0;
 | 
					      selcost[sel]=cost0;
 | 
				
			||||||
@@ -658,8 +690,8 @@ static int tf_analysis(const CELTMode *m, int len, int isTransient,
 | 
				
			|||||||
    * If tests confirm it's useful for non-transients, we could allow it. */
 | 
					    * If tests confirm it's useful for non-transients, we could allow it. */
 | 
				
			||||||
   if (selcost[1]<selcost[0] && isTransient)
 | 
					   if (selcost[1]<selcost[0] && isTransient)
 | 
				
			||||||
      tf_select=1;
 | 
					      tf_select=1;
 | 
				
			||||||
   cost0 = 0;
 | 
					   cost0 = importance[0]*abs(metric[0]-2*tf_select_table[LM][4*isTransient+2*tf_select+0]);
 | 
				
			||||||
   cost1 = isTransient ? 0 : lambda;
 | 
					   cost1 = importance[0]*abs(metric[0]-2*tf_select_table[LM][4*isTransient+2*tf_select+1]) + (isTransient ? 0 : lambda);
 | 
				
			||||||
   /* Viterbi forward pass */
 | 
					   /* Viterbi forward pass */
 | 
				
			||||||
   for (i=1;i<len;i++)
 | 
					   for (i=1;i<len;i++)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
@@ -687,8 +719,8 @@ static int tf_analysis(const CELTMode *m, int len, int isTransient,
 | 
				
			|||||||
         curr1 = from1;
 | 
					         curr1 = from1;
 | 
				
			||||||
         path1[i]= 1;
 | 
					         path1[i]= 1;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      cost0 = curr0 + abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*tf_select+0]);
 | 
					      cost0 = curr0 + importance[i]*abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*tf_select+0]);
 | 
				
			||||||
      cost1 = curr1 + abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*tf_select+1]);
 | 
					      cost1 = curr1 + importance[i]*abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*tf_select+1]);
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
   tf_res[len-1] = cost0 < cost1 ? 0 : 1;
 | 
					   tf_res[len-1] = cost0 < cost1 ? 0 : 1;
 | 
				
			||||||
   /* Viterbi backward pass to check the decisions */
 | 
					   /* Viterbi backward pass to check the decisions */
 | 
				
			||||||
@@ -754,7 +786,7 @@ static void tf_encode(int start, int end, int isTransient, int *tf_res, int LM,
 | 
				
			|||||||
static int alloc_trim_analysis(const CELTMode *m, const celt_norm *X,
 | 
					static int alloc_trim_analysis(const CELTMode *m, const celt_norm *X,
 | 
				
			||||||
      const opus_val16 *bandLogE, int end, int LM, int C, int N0,
 | 
					      const opus_val16 *bandLogE, int end, int LM, int C, int N0,
 | 
				
			||||||
      AnalysisInfo *analysis, opus_val16 *stereo_saving, opus_val16 tf_estimate,
 | 
					      AnalysisInfo *analysis, opus_val16 *stereo_saving, opus_val16 tf_estimate,
 | 
				
			||||||
      int intensity, opus_val16 surround_trim, int arch)
 | 
					      int intensity, opus_val16 surround_trim, opus_int32 equiv_rate, int arch)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   int i;
 | 
					   int i;
 | 
				
			||||||
   opus_val32 diff=0;
 | 
					   opus_val32 diff=0;
 | 
				
			||||||
@@ -762,6 +794,14 @@ static int alloc_trim_analysis(const CELTMode *m, const celt_norm *X,
 | 
				
			|||||||
   int trim_index;
 | 
					   int trim_index;
 | 
				
			||||||
   opus_val16 trim = QCONST16(5.f, 8);
 | 
					   opus_val16 trim = QCONST16(5.f, 8);
 | 
				
			||||||
   opus_val16 logXC, logXC2;
 | 
					   opus_val16 logXC, logXC2;
 | 
				
			||||||
 | 
					   /* At low bitrate, reducing the trim seems to help. At higher bitrates, it's less
 | 
				
			||||||
 | 
					      clear what's best, so we're keeping it as it was before, at least for now. */
 | 
				
			||||||
 | 
					   if (equiv_rate < 64000) {
 | 
				
			||||||
 | 
					      trim = QCONST16(4.f, 8);
 | 
				
			||||||
 | 
					   } else if (equiv_rate < 80000) {
 | 
				
			||||||
 | 
					      opus_int32 frac = (equiv_rate-64000) >> 10;
 | 
				
			||||||
 | 
					      trim = QCONST16(4.f, 8) + QCONST16(1.f/16.f, 8)*frac;
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
   if (C==2)
 | 
					   if (C==2)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
      opus_val16 sum = 0; /* Q10 */
 | 
					      opus_val16 sum = 0; /* Q10 */
 | 
				
			||||||
@@ -809,7 +849,7 @@ static int alloc_trim_analysis(const CELTMode *m, const celt_norm *X,
 | 
				
			|||||||
   } while (++c<C);
 | 
					   } while (++c<C);
 | 
				
			||||||
   diff /= C*(end-1);
 | 
					   diff /= C*(end-1);
 | 
				
			||||||
   /*printf("%f\n", diff);*/
 | 
					   /*printf("%f\n", diff);*/
 | 
				
			||||||
   trim -= MAX16(-QCONST16(2.f, 8), MIN16(QCONST16(2.f, 8), SHR16(diff+QCONST16(1.f, DB_SHIFT),DB_SHIFT-8)/6 ));
 | 
					   trim -= MAX32(-QCONST16(2.f, 8), MIN32(QCONST16(2.f, 8), SHR32(diff+QCONST16(1.f, DB_SHIFT),DB_SHIFT-8)/6 ));
 | 
				
			||||||
   trim -= SHR16(surround_trim, DB_SHIFT-8);
 | 
					   trim -= SHR16(surround_trim, DB_SHIFT-8);
 | 
				
			||||||
   trim -= 2*SHR16(tf_estimate, 14-8);
 | 
					   trim -= 2*SHR16(tf_estimate, 14-8);
 | 
				
			||||||
#ifndef DISABLE_FLOAT_API
 | 
					#ifndef DISABLE_FLOAT_API
 | 
				
			||||||
@@ -930,7 +970,8 @@ static opus_val16 median_of_3(const opus_val16 *x)
 | 
				
			|||||||
static opus_val16 dynalloc_analysis(const opus_val16 *bandLogE, const opus_val16 *bandLogE2,
 | 
					static opus_val16 dynalloc_analysis(const opus_val16 *bandLogE, const opus_val16 *bandLogE2,
 | 
				
			||||||
      int nbEBands, int start, int end, int C, int *offsets, int lsb_depth, const opus_int16 *logN,
 | 
					      int nbEBands, int start, int end, int C, int *offsets, int lsb_depth, const opus_int16 *logN,
 | 
				
			||||||
      int isTransient, int vbr, int constrained_vbr, const opus_int16 *eBands, int LM,
 | 
					      int isTransient, int vbr, int constrained_vbr, const opus_int16 *eBands, int LM,
 | 
				
			||||||
      int effectiveBytes, opus_int32 *tot_boost_, int lfe, opus_val16 *surround_dynalloc)
 | 
					      int effectiveBytes, opus_int32 *tot_boost_, int lfe, opus_val16 *surround_dynalloc,
 | 
				
			||||||
 | 
					      AnalysisInfo *analysis, int *importance, int *spread_weight)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   int i, c;
 | 
					   int i, c;
 | 
				
			||||||
   opus_int32 tot_boost=0;
 | 
					   opus_int32 tot_boost=0;
 | 
				
			||||||
@@ -956,6 +997,42 @@ static opus_val16 dynalloc_analysis(const opus_val16 *bandLogE, const opus_val16
 | 
				
			|||||||
      for (i=0;i<end;i++)
 | 
					      for (i=0;i<end;i++)
 | 
				
			||||||
         maxDepth = MAX16(maxDepth, bandLogE[c*nbEBands+i]-noise_floor[i]);
 | 
					         maxDepth = MAX16(maxDepth, bandLogE[c*nbEBands+i]-noise_floor[i]);
 | 
				
			||||||
   } while (++c<C);
 | 
					   } while (++c<C);
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					      /* Compute a really simple masking model to avoid taking into account completely masked
 | 
				
			||||||
 | 
					         bands when computing the spreading decision. */
 | 
				
			||||||
 | 
					      VARDECL(opus_val16, mask);
 | 
				
			||||||
 | 
					      VARDECL(opus_val16, sig);
 | 
				
			||||||
 | 
					      ALLOC(mask, nbEBands, opus_val16);
 | 
				
			||||||
 | 
					      ALLOC(sig, nbEBands, opus_val16);
 | 
				
			||||||
 | 
					      for (i=0;i<end;i++)
 | 
				
			||||||
 | 
					         mask[i] = bandLogE[i]-noise_floor[i];
 | 
				
			||||||
 | 
					      if (C==2)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					         for (i=0;i<end;i++)
 | 
				
			||||||
 | 
					            mask[i] = MAX16(mask[i], bandLogE[nbEBands+i]-noise_floor[i]);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      OPUS_COPY(sig, mask, end);
 | 
				
			||||||
 | 
					      for (i=1;i<end;i++)
 | 
				
			||||||
 | 
					         mask[i] = MAX16(mask[i], mask[i-1] - QCONST16(2.f, DB_SHIFT));
 | 
				
			||||||
 | 
					      for (i=end-2;i>=0;i--)
 | 
				
			||||||
 | 
					         mask[i] = MAX16(mask[i], mask[i+1] - QCONST16(3.f, DB_SHIFT));
 | 
				
			||||||
 | 
					      for (i=0;i<end;i++)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					         /* Compute SMR: Mask is never more than 72 dB below the peak and never below the noise floor.*/
 | 
				
			||||||
 | 
					         opus_val16 smr = sig[i]-MAX16(MAX16(0, maxDepth-QCONST16(12.f, DB_SHIFT)), mask[i]);
 | 
				
			||||||
 | 
					         /* Clamp SMR to make sure we're not shifting by something negative or too large. */
 | 
				
			||||||
 | 
					#ifdef FIXED_POINT
 | 
				
			||||||
 | 
					         /* FIXME: Use PSHR16() instead */
 | 
				
			||||||
 | 
					         int shift = -PSHR32(MAX16(-QCONST16(5.f, DB_SHIFT), MIN16(0, smr)), DB_SHIFT);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					         int shift = IMIN(5, IMAX(0, -(int)floor(.5f + smr)));
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					         spread_weight[i] = 32 >> shift;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      /*for (i=0;i<end;i++)
 | 
				
			||||||
 | 
					         printf("%d ", spread_weight[i]);
 | 
				
			||||||
 | 
					      printf("\n");*/
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
   /* Make sure that dynamic allocation can't make us bust the budget */
 | 
					   /* Make sure that dynamic allocation can't make us bust the budget */
 | 
				
			||||||
   if (effectiveBytes > 50 && LM>=1 && !lfe)
 | 
					   if (effectiveBytes > 50 && LM>=1 && !lfe)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
@@ -1012,6 +1089,14 @@ static opus_val16 dynalloc_analysis(const opus_val16 *bandLogE, const opus_val16
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
      for (i=start;i<end;i++)
 | 
					      for (i=start;i<end;i++)
 | 
				
			||||||
         follower[i] = MAX16(follower[i], surround_dynalloc[i]);
 | 
					         follower[i] = MAX16(follower[i], surround_dynalloc[i]);
 | 
				
			||||||
 | 
					      for (i=start;i<end;i++)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					#ifdef FIXED_POINT
 | 
				
			||||||
 | 
					         importance[i] = PSHR32(13*celt_exp2(MIN16(follower[i], QCONST16(4.f, DB_SHIFT))), 16);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					         importance[i] = (int)floor(.5f+13*celt_exp2(MIN16(follower[i], QCONST16(4.f, DB_SHIFT))));
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
      /* For non-transient CBR/CVBR frames, halve the dynalloc contribution */
 | 
					      /* For non-transient CBR/CVBR frames, halve the dynalloc contribution */
 | 
				
			||||||
      if ((!vbr || constrained_vbr)&&!isTransient)
 | 
					      if ((!vbr || constrained_vbr)&&!isTransient)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
@@ -1020,14 +1105,26 @@ static opus_val16 dynalloc_analysis(const opus_val16 *bandLogE, const opus_val16
 | 
				
			|||||||
      }
 | 
					      }
 | 
				
			||||||
      for (i=start;i<end;i++)
 | 
					      for (i=start;i<end;i++)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
         int width;
 | 
					 | 
				
			||||||
         int boost;
 | 
					 | 
				
			||||||
         int boost_bits;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
         if (i<8)
 | 
					         if (i<8)
 | 
				
			||||||
            follower[i] *= 2;
 | 
					            follower[i] *= 2;
 | 
				
			||||||
         if (i>=12)
 | 
					         if (i>=12)
 | 
				
			||||||
            follower[i] = HALF16(follower[i]);
 | 
					            follower[i] = HALF16(follower[i]);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					#ifdef DISABLE_FLOAT_API
 | 
				
			||||||
 | 
					      (void)analysis;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					      if (analysis->valid)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					         for (i=start;i<IMIN(LEAK_BANDS, end);i++)
 | 
				
			||||||
 | 
					            follower[i] = follower[i] +  QCONST16(1.f/64.f, DB_SHIFT)*analysis->leak_boost[i];
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					      for (i=start;i<end;i++)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					         int width;
 | 
				
			||||||
 | 
					         int boost;
 | 
				
			||||||
 | 
					         int boost_bits;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         follower[i] = MIN16(follower[i], QCONST16(4, DB_SHIFT));
 | 
					         follower[i] = MIN16(follower[i], QCONST16(4, DB_SHIFT));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         width = C*(eBands[i+1]-eBands[i])<<LM;
 | 
					         width = C*(eBands[i+1]-eBands[i])<<LM;
 | 
				
			||||||
@@ -1042,11 +1139,11 @@ static opus_val16 dynalloc_analysis(const opus_val16 *bandLogE, const opus_val16
 | 
				
			|||||||
            boost = (int)SHR32(EXTEND32(follower[i])*width/6,DB_SHIFT);
 | 
					            boost = (int)SHR32(EXTEND32(follower[i])*width/6,DB_SHIFT);
 | 
				
			||||||
            boost_bits = boost*6<<BITRES;
 | 
					            boost_bits = boost*6<<BITRES;
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
         /* For CBR and non-transient CVBR frames, limit dynalloc to 1/4 of the bits */
 | 
					         /* For CBR and non-transient CVBR frames, limit dynalloc to 2/3 of the bits */
 | 
				
			||||||
         if ((!vbr || (constrained_vbr&&!isTransient))
 | 
					         if ((!vbr || (constrained_vbr&&!isTransient))
 | 
				
			||||||
               && (tot_boost+boost_bits)>>BITRES>>3 > effectiveBytes/4)
 | 
					               && (tot_boost+boost_bits)>>BITRES>>3 > 2*effectiveBytes/3)
 | 
				
			||||||
         {
 | 
					         {
 | 
				
			||||||
            opus_int32 cap = ((effectiveBytes/4)<<BITRES<<3);
 | 
					            opus_int32 cap = ((2*effectiveBytes/3)<<BITRES<<3);
 | 
				
			||||||
            offsets[i] = cap-tot_boost;
 | 
					            offsets[i] = cap-tot_boost;
 | 
				
			||||||
            tot_boost = cap;
 | 
					            tot_boost = cap;
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
@@ -1055,6 +1152,9 @@ static opus_val16 dynalloc_analysis(const opus_val16 *bandLogE, const opus_val16
 | 
				
			|||||||
            tot_boost += boost_bits;
 | 
					            tot_boost += boost_bits;
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					   } else {
 | 
				
			||||||
 | 
					      for (i=start;i<end;i++)
 | 
				
			||||||
 | 
					         importance[i] = 13;
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
   *tot_boost_ = tot_boost;
 | 
					   *tot_boost_ = tot_boost;
 | 
				
			||||||
   RESTORE_STACK;
 | 
					   RESTORE_STACK;
 | 
				
			||||||
@@ -1063,7 +1163,7 @@ static opus_val16 dynalloc_analysis(const opus_val16 *bandLogE, const opus_val16
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int run_prefilter(CELTEncoder *st, celt_sig *in, celt_sig *prefilter_mem, int CC, int N,
 | 
					static int run_prefilter(CELTEncoder *st, celt_sig *in, celt_sig *prefilter_mem, int CC, int N,
 | 
				
			||||||
      int prefilter_tapset, int *pitch, opus_val16 *gain, int *qgain, int enabled, int nbAvailableBytes)
 | 
					      int prefilter_tapset, int *pitch, opus_val16 *gain, int *qgain, int enabled, int nbAvailableBytes, AnalysisInfo *analysis)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   int c;
 | 
					   int c;
 | 
				
			||||||
   VARDECL(celt_sig, _pre);
 | 
					   VARDECL(celt_sig, _pre);
 | 
				
			||||||
@@ -1119,7 +1219,12 @@ static int run_prefilter(CELTEncoder *st, celt_sig *in, celt_sig *prefilter_mem,
 | 
				
			|||||||
      gain1 = 0;
 | 
					      gain1 = 0;
 | 
				
			||||||
      pitch_index = COMBFILTER_MINPERIOD;
 | 
					      pitch_index = COMBFILTER_MINPERIOD;
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 | 
					#ifndef DISABLE_FLOAT_API
 | 
				
			||||||
 | 
					   if (analysis->valid)
 | 
				
			||||||
 | 
					      gain1 = (opus_val16)(gain1 * analysis->max_pitch_ratio);
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					   (void)analysis;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
   /* Gain threshold for enabling the prefilter/postfilter */
 | 
					   /* Gain threshold for enabling the prefilter/postfilter */
 | 
				
			||||||
   pf_threshold = QCONST16(.2f,15);
 | 
					   pf_threshold = QCONST16(.2f,15);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1175,10 +1280,10 @@ static int run_prefilter(CELTEncoder *st, celt_sig *in, celt_sig *prefilter_mem,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      if (N>COMBFILTER_MAXPERIOD)
 | 
					      if (N>COMBFILTER_MAXPERIOD)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
         OPUS_MOVE(prefilter_mem+c*COMBFILTER_MAXPERIOD, pre[c]+N, COMBFILTER_MAXPERIOD);
 | 
					         OPUS_COPY(prefilter_mem+c*COMBFILTER_MAXPERIOD, pre[c]+N, COMBFILTER_MAXPERIOD);
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
         OPUS_MOVE(prefilter_mem+c*COMBFILTER_MAXPERIOD, prefilter_mem+c*COMBFILTER_MAXPERIOD+N, COMBFILTER_MAXPERIOD-N);
 | 
					         OPUS_MOVE(prefilter_mem+c*COMBFILTER_MAXPERIOD, prefilter_mem+c*COMBFILTER_MAXPERIOD+N, COMBFILTER_MAXPERIOD-N);
 | 
				
			||||||
         OPUS_MOVE(prefilter_mem+c*COMBFILTER_MAXPERIOD+COMBFILTER_MAXPERIOD-N, pre[c]+COMBFILTER_MAXPERIOD, N);
 | 
					         OPUS_COPY(prefilter_mem+c*COMBFILTER_MAXPERIOD+COMBFILTER_MAXPERIOD-N, pre[c]+COMBFILTER_MAXPERIOD, N);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
   } while (++c<CC);
 | 
					   } while (++c<CC);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1193,7 +1298,7 @@ static int compute_vbr(const CELTMode *mode, AnalysisInfo *analysis, opus_int32
 | 
				
			|||||||
      int LM, opus_int32 bitrate, int lastCodedBands, int C, int intensity,
 | 
					      int LM, opus_int32 bitrate, int lastCodedBands, int C, int intensity,
 | 
				
			||||||
      int constrained_vbr, opus_val16 stereo_saving, int tot_boost,
 | 
					      int constrained_vbr, opus_val16 stereo_saving, int tot_boost,
 | 
				
			||||||
      opus_val16 tf_estimate, int pitch_change, opus_val16 maxDepth,
 | 
					      opus_val16 tf_estimate, int pitch_change, opus_val16 maxDepth,
 | 
				
			||||||
      int variable_duration, int lfe, int has_surround_mask, opus_val16 surround_masking,
 | 
					      int lfe, int has_surround_mask, opus_val16 surround_masking,
 | 
				
			||||||
      opus_val16 temporal_vbr)
 | 
					      opus_val16 temporal_vbr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   /* The target rate in 8th bits per frame */
 | 
					   /* The target rate in 8th bits per frame */
 | 
				
			||||||
@@ -1235,10 +1340,9 @@ static int compute_vbr(const CELTMode *mode, AnalysisInfo *analysis, opus_int32
 | 
				
			|||||||
                      SHR32(MULT16_16(stereo_saving-QCONST16(0.1f,8),(coded_stereo_dof<<BITRES)),8));
 | 
					                      SHR32(MULT16_16(stereo_saving-QCONST16(0.1f,8),(coded_stereo_dof<<BITRES)),8));
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
   /* Boost the rate according to dynalloc (minus the dynalloc average for calibration). */
 | 
					   /* Boost the rate according to dynalloc (minus the dynalloc average for calibration). */
 | 
				
			||||||
   target += tot_boost-(16<<LM);
 | 
					   target += tot_boost-(19<<LM);
 | 
				
			||||||
   /* Apply transient boost, compensating for average boost. */
 | 
					   /* Apply transient boost, compensating for average boost. */
 | 
				
			||||||
   tf_calibration = variable_duration==OPUS_FRAMESIZE_VARIABLE ?
 | 
					   tf_calibration = QCONST16(0.044f,14);
 | 
				
			||||||
                    QCONST16(0.02f,14) : QCONST16(0.04f,14);
 | 
					 | 
				
			||||||
   target += (opus_int32)SHL32(MULT16_32_Q15(tf_estimate-tf_calibration, target),1);
 | 
					   target += (opus_int32)SHL32(MULT16_32_Q15(tf_estimate-tf_calibration, target),1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef DISABLE_FLOAT_API
 | 
					#ifndef DISABLE_FLOAT_API
 | 
				
			||||||
@@ -1249,7 +1353,7 @@ static int compute_vbr(const CELTMode *mode, AnalysisInfo *analysis, opus_int32
 | 
				
			|||||||
      float tonal;
 | 
					      float tonal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      /* Tonality boost (compensating for the average). */
 | 
					      /* Tonality boost (compensating for the average). */
 | 
				
			||||||
      tonal = MAX16(0.f,analysis->tonality-.15f)-0.09f;
 | 
					      tonal = MAX16(0.f,analysis->tonality-.15f)-0.12f;
 | 
				
			||||||
      tonal_target = target + (opus_int32)((coded_bins<<BITRES)*1.2f*tonal);
 | 
					      tonal_target = target + (opus_int32)((coded_bins<<BITRES)*1.2f*tonal);
 | 
				
			||||||
      if (pitch_change)
 | 
					      if (pitch_change)
 | 
				
			||||||
         tonal_target +=  (opus_int32)((coded_bins<<BITRES)*.8f);
 | 
					         tonal_target +=  (opus_int32)((coded_bins<<BITRES)*.8f);
 | 
				
			||||||
@@ -1279,18 +1383,11 @@ static int compute_vbr(const CELTMode *mode, AnalysisInfo *analysis, opus_int32
 | 
				
			|||||||
      /*printf("%f %d\n", maxDepth, floor_depth);*/
 | 
					      /*printf("%f %d\n", maxDepth, floor_depth);*/
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   if ((!has_surround_mask||lfe) && (constrained_vbr || bitrate<64000))
 | 
					   /* Make VBR less aggressive for constrained VBR because we can't keep a higher bitrate
 | 
				
			||||||
 | 
					      for long. Needs tuning. */
 | 
				
			||||||
 | 
					   if ((!has_surround_mask||lfe) && constrained_vbr)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
      opus_val16 rate_factor;
 | 
					      target = base_target + (opus_int32)MULT16_32_Q15(QCONST16(0.67f, 15), target-base_target);
 | 
				
			||||||
#ifdef FIXED_POINT
 | 
					 | 
				
			||||||
      rate_factor = MAX16(0,(bitrate-32000));
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
      rate_factor = MAX16(0,(1.f/32768)*(bitrate-32000));
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
      if (constrained_vbr)
 | 
					 | 
				
			||||||
         rate_factor = MIN16(rate_factor, QCONST16(0.67f, 15));
 | 
					 | 
				
			||||||
      target = base_target + (opus_int32)MULT16_32_Q15(rate_factor, target-base_target);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   if (!has_surround_mask && tf_estimate < QCONST16(.2f, 14))
 | 
					   if (!has_surround_mask && tf_estimate < QCONST16(.2f, 14))
 | 
				
			||||||
@@ -1324,11 +1421,13 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm,
 | 
				
			|||||||
   VARDECL(int, pulses);
 | 
					   VARDECL(int, pulses);
 | 
				
			||||||
   VARDECL(int, cap);
 | 
					   VARDECL(int, cap);
 | 
				
			||||||
   VARDECL(int, offsets);
 | 
					   VARDECL(int, offsets);
 | 
				
			||||||
 | 
					   VARDECL(int, importance);
 | 
				
			||||||
 | 
					   VARDECL(int, spread_weight);
 | 
				
			||||||
   VARDECL(int, fine_priority);
 | 
					   VARDECL(int, fine_priority);
 | 
				
			||||||
   VARDECL(int, tf_res);
 | 
					   VARDECL(int, tf_res);
 | 
				
			||||||
   VARDECL(unsigned char, collapse_masks);
 | 
					   VARDECL(unsigned char, collapse_masks);
 | 
				
			||||||
   celt_sig *prefilter_mem;
 | 
					   celt_sig *prefilter_mem;
 | 
				
			||||||
   opus_val16 *oldBandE, *oldLogE, *oldLogE2;
 | 
					   opus_val16 *oldBandE, *oldLogE, *oldLogE2, *energyError;
 | 
				
			||||||
   int shortBlocks=0;
 | 
					   int shortBlocks=0;
 | 
				
			||||||
   int isTransient=0;
 | 
					   int isTransient=0;
 | 
				
			||||||
   const int CC = st->channels;
 | 
					   const int CC = st->channels;
 | 
				
			||||||
@@ -1340,7 +1439,6 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm,
 | 
				
			|||||||
   int end;
 | 
					   int end;
 | 
				
			||||||
   int effEnd;
 | 
					   int effEnd;
 | 
				
			||||||
   int codedBands;
 | 
					   int codedBands;
 | 
				
			||||||
   int tf_sum;
 | 
					 | 
				
			||||||
   int alloc_trim;
 | 
					   int alloc_trim;
 | 
				
			||||||
   int pitch_index=COMBFILTER_MINPERIOD;
 | 
					   int pitch_index=COMBFILTER_MINPERIOD;
 | 
				
			||||||
   opus_val16 gain1 = 0;
 | 
					   opus_val16 gain1 = 0;
 | 
				
			||||||
@@ -1352,6 +1450,7 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm,
 | 
				
			|||||||
   opus_int32 total_boost;
 | 
					   opus_int32 total_boost;
 | 
				
			||||||
   opus_int32 balance;
 | 
					   opus_int32 balance;
 | 
				
			||||||
   opus_int32 tell;
 | 
					   opus_int32 tell;
 | 
				
			||||||
 | 
					   opus_int32 tell0_frac;
 | 
				
			||||||
   int prefilter_tapset=0;
 | 
					   int prefilter_tapset=0;
 | 
				
			||||||
   int pf_on;
 | 
					   int pf_on;
 | 
				
			||||||
   int anti_collapse_rsv;
 | 
					   int anti_collapse_rsv;
 | 
				
			||||||
@@ -1373,7 +1472,10 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm,
 | 
				
			|||||||
   opus_val16 surround_masking=0;
 | 
					   opus_val16 surround_masking=0;
 | 
				
			||||||
   opus_val16 temporal_vbr=0;
 | 
					   opus_val16 temporal_vbr=0;
 | 
				
			||||||
   opus_val16 surround_trim = 0;
 | 
					   opus_val16 surround_trim = 0;
 | 
				
			||||||
   opus_int32 equiv_rate = 510000;
 | 
					   opus_int32 equiv_rate;
 | 
				
			||||||
 | 
					   int hybrid;
 | 
				
			||||||
 | 
					   int weak_transient = 0;
 | 
				
			||||||
 | 
					   int enable_tf_analysis;
 | 
				
			||||||
   VARDECL(opus_val16, surround_dynalloc);
 | 
					   VARDECL(opus_val16, surround_dynalloc);
 | 
				
			||||||
   ALLOC_STACK;
 | 
					   ALLOC_STACK;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1383,6 +1485,7 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm,
 | 
				
			|||||||
   eBands = mode->eBands;
 | 
					   eBands = mode->eBands;
 | 
				
			||||||
   start = st->start;
 | 
					   start = st->start;
 | 
				
			||||||
   end = st->end;
 | 
					   end = st->end;
 | 
				
			||||||
 | 
					   hybrid = start != 0;
 | 
				
			||||||
   tf_estimate = 0;
 | 
					   tf_estimate = 0;
 | 
				
			||||||
   if (nbCompressedBytes<2 || pcm==NULL)
 | 
					   if (nbCompressedBytes<2 || pcm==NULL)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
@@ -1406,12 +1509,14 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm,
 | 
				
			|||||||
   oldBandE = (opus_val16*)(st->in_mem+CC*(overlap+COMBFILTER_MAXPERIOD));
 | 
					   oldBandE = (opus_val16*)(st->in_mem+CC*(overlap+COMBFILTER_MAXPERIOD));
 | 
				
			||||||
   oldLogE = oldBandE + CC*nbEBands;
 | 
					   oldLogE = oldBandE + CC*nbEBands;
 | 
				
			||||||
   oldLogE2 = oldLogE + CC*nbEBands;
 | 
					   oldLogE2 = oldLogE + CC*nbEBands;
 | 
				
			||||||
 | 
					   energyError = oldLogE2 + CC*nbEBands;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   if (enc==NULL)
 | 
					   if (enc==NULL)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
      tell=1;
 | 
					      tell0_frac=tell=1;
 | 
				
			||||||
      nbFilledBytes=0;
 | 
					      nbFilledBytes=0;
 | 
				
			||||||
   } else {
 | 
					   } else {
 | 
				
			||||||
 | 
					      tell0_frac=ec_tell_frac(enc);
 | 
				
			||||||
      tell=ec_tell(enc);
 | 
					      tell=ec_tell(enc);
 | 
				
			||||||
      nbFilledBytes=(tell+4)>>3;
 | 
					      nbFilledBytes=(tell+4)>>3;
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
@@ -1464,10 +1569,11 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm,
 | 
				
			|||||||
      if (st->bitrate!=OPUS_BITRATE_MAX)
 | 
					      if (st->bitrate!=OPUS_BITRATE_MAX)
 | 
				
			||||||
         nbCompressedBytes = IMAX(2, IMIN(nbCompressedBytes,
 | 
					         nbCompressedBytes = IMAX(2, IMIN(nbCompressedBytes,
 | 
				
			||||||
               (tmp+4*mode->Fs)/(8*mode->Fs)-!!st->signalling));
 | 
					               (tmp+4*mode->Fs)/(8*mode->Fs)-!!st->signalling));
 | 
				
			||||||
      effectiveBytes = nbCompressedBytes;
 | 
					      effectiveBytes = nbCompressedBytes - nbFilledBytes;
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 | 
					   equiv_rate = ((opus_int32)nbCompressedBytes*8*50 >> (3-LM)) - (40*C+20)*((400>>LM) - 50);
 | 
				
			||||||
   if (st->bitrate != OPUS_BITRATE_MAX)
 | 
					   if (st->bitrate != OPUS_BITRATE_MAX)
 | 
				
			||||||
      equiv_rate = st->bitrate - (40*C+20)*((400>>LM) - 50);
 | 
					      equiv_rate = IMIN(equiv_rate, st->bitrate - (40*C+20)*((400>>LM) - 50));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   if (enc==NULL)
 | 
					   if (enc==NULL)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
@@ -1555,17 +1661,17 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm,
 | 
				
			|||||||
   {
 | 
					   {
 | 
				
			||||||
      int enabled;
 | 
					      int enabled;
 | 
				
			||||||
      int qg;
 | 
					      int qg;
 | 
				
			||||||
      enabled = ((st->lfe&&nbAvailableBytes>3) || nbAvailableBytes>12*C) && start==0 && !silence && !st->disable_pf
 | 
					      enabled = ((st->lfe&&nbAvailableBytes>3) || nbAvailableBytes>12*C) && !hybrid && !silence && !st->disable_pf
 | 
				
			||||||
            && st->complexity >= 5 && !(st->consec_transient && LM!=3 && st->variable_duration==OPUS_FRAMESIZE_VARIABLE);
 | 
					            && st->complexity >= 5;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      prefilter_tapset = st->tapset_decision;
 | 
					      prefilter_tapset = st->tapset_decision;
 | 
				
			||||||
      pf_on = run_prefilter(st, in, prefilter_mem, CC, N, prefilter_tapset, &pitch_index, &gain1, &qg, enabled, nbAvailableBytes);
 | 
					      pf_on = run_prefilter(st, in, prefilter_mem, CC, N, prefilter_tapset, &pitch_index, &gain1, &qg, enabled, nbAvailableBytes, &st->analysis);
 | 
				
			||||||
      if ((gain1 > QCONST16(.4f,15) || st->prefilter_gain > QCONST16(.4f,15)) && (!st->analysis.valid || st->analysis.tonality > .3)
 | 
					      if ((gain1 > QCONST16(.4f,15) || st->prefilter_gain > QCONST16(.4f,15)) && (!st->analysis.valid || st->analysis.tonality > .3)
 | 
				
			||||||
            && (pitch_index > 1.26*st->prefilter_period || pitch_index < .79*st->prefilter_period))
 | 
					            && (pitch_index > 1.26*st->prefilter_period || pitch_index < .79*st->prefilter_period))
 | 
				
			||||||
         pitch_change = 1;
 | 
					         pitch_change = 1;
 | 
				
			||||||
      if (pf_on==0)
 | 
					      if (pf_on==0)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
         if(start==0 && tell+16<=total_bits)
 | 
					         if(!hybrid && tell+16<=total_bits)
 | 
				
			||||||
            ec_enc_bit_logp(enc, 0, 1);
 | 
					            ec_enc_bit_logp(enc, 0, 1);
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
         /*This block is not gated by a total bits check only because
 | 
					         /*This block is not gated by a total bits check only because
 | 
				
			||||||
@@ -1586,8 +1692,12 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm,
 | 
				
			|||||||
   shortBlocks = 0;
 | 
					   shortBlocks = 0;
 | 
				
			||||||
   if (st->complexity >= 1 && !st->lfe)
 | 
					   if (st->complexity >= 1 && !st->lfe)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
 | 
					      /* Reduces the likelihood of energy instability on fricatives at low bitrate
 | 
				
			||||||
 | 
					         in hybrid mode. It seems like we still want to have real transients on vowels
 | 
				
			||||||
 | 
					         though (small SILK quantization offset value). */
 | 
				
			||||||
 | 
					      int allow_weak_transients = hybrid && effectiveBytes<15 && st->silk_info.signalType != 2;
 | 
				
			||||||
      isTransient = transient_analysis(in, N+overlap, CC,
 | 
					      isTransient = transient_analysis(in, N+overlap, CC,
 | 
				
			||||||
            &tf_estimate, &tf_chan);
 | 
					            &tf_estimate, &tf_chan, allow_weak_transients, &weak_transient);
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
   if (LM>0 && ec_tell(enc)+3<=total_bits)
 | 
					   if (LM>0 && ec_tell(enc)+3<=total_bits)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
@@ -1607,16 +1717,19 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm,
 | 
				
			|||||||
   if (secondMdct)
 | 
					   if (secondMdct)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
      compute_mdcts(mode, 0, in, freq, C, CC, LM, st->upsample, st->arch);
 | 
					      compute_mdcts(mode, 0, in, freq, C, CC, LM, st->upsample, st->arch);
 | 
				
			||||||
      compute_band_energies(mode, freq, bandE, effEnd, C, LM);
 | 
					      compute_band_energies(mode, freq, bandE, effEnd, C, LM, st->arch);
 | 
				
			||||||
      amp2Log2(mode, effEnd, end, bandE, bandLogE2, C);
 | 
					      amp2Log2(mode, effEnd, end, bandE, bandLogE2, C);
 | 
				
			||||||
      for (i=0;i<C*nbEBands;i++)
 | 
					      for (i=0;i<C*nbEBands;i++)
 | 
				
			||||||
         bandLogE2[i] += HALF16(SHL16(LM, DB_SHIFT));
 | 
					         bandLogE2[i] += HALF16(SHL16(LM, DB_SHIFT));
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   compute_mdcts(mode, shortBlocks, in, freq, C, CC, LM, st->upsample, st->arch);
 | 
					   compute_mdcts(mode, shortBlocks, in, freq, C, CC, LM, st->upsample, st->arch);
 | 
				
			||||||
 | 
					   /* This should catch any NaN in the CELT input. Since we're not supposed to see any (they're filtered
 | 
				
			||||||
 | 
					      at the Opus layer), just abort. */
 | 
				
			||||||
 | 
					   celt_assert(!celt_isnan(freq[0]) && (C==1 || !celt_isnan(freq[N])));
 | 
				
			||||||
   if (CC==2&&C==1)
 | 
					   if (CC==2&&C==1)
 | 
				
			||||||
      tf_chan = 0;
 | 
					      tf_chan = 0;
 | 
				
			||||||
   compute_band_energies(mode, freq, bandE, effEnd, C, LM);
 | 
					   compute_band_energies(mode, freq, bandE, effEnd, C, LM, st->arch);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   if (st->lfe)
 | 
					   if (st->lfe)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
@@ -1631,7 +1744,7 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm,
 | 
				
			|||||||
   ALLOC(surround_dynalloc, C*nbEBands, opus_val16);
 | 
					   ALLOC(surround_dynalloc, C*nbEBands, opus_val16);
 | 
				
			||||||
   OPUS_CLEAR(surround_dynalloc, end);
 | 
					   OPUS_CLEAR(surround_dynalloc, end);
 | 
				
			||||||
   /* This computes how much masking takes place between surround channels */
 | 
					   /* This computes how much masking takes place between surround channels */
 | 
				
			||||||
   if (start==0&&st->energy_mask&&!st->lfe)
 | 
					   if (!hybrid&&st->energy_mask&&!st->lfe)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
      int mask_end;
 | 
					      int mask_end;
 | 
				
			||||||
      int midband;
 | 
					      int midband;
 | 
				
			||||||
@@ -1733,14 +1846,14 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
   /* Last chance to catch any transient we might have missed in the
 | 
					   /* Last chance to catch any transient we might have missed in the
 | 
				
			||||||
      time-domain analysis */
 | 
					      time-domain analysis */
 | 
				
			||||||
   if (LM>0 && ec_tell(enc)+3<=total_bits && !isTransient && st->complexity>=5 && !st->lfe)
 | 
					   if (LM>0 && ec_tell(enc)+3<=total_bits && !isTransient && st->complexity>=5 && !st->lfe && !hybrid)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
      if (patch_transient_decision(bandLogE, oldBandE, nbEBands, start, end, C))
 | 
					      if (patch_transient_decision(bandLogE, oldBandE, nbEBands, start, end, C))
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
         isTransient = 1;
 | 
					         isTransient = 1;
 | 
				
			||||||
         shortBlocks = M;
 | 
					         shortBlocks = M;
 | 
				
			||||||
         compute_mdcts(mode, shortBlocks, in, freq, C, CC, LM, st->upsample, st->arch);
 | 
					         compute_mdcts(mode, shortBlocks, in, freq, C, CC, LM, st->upsample, st->arch);
 | 
				
			||||||
         compute_band_energies(mode, freq, bandE, effEnd, C, LM);
 | 
					         compute_band_energies(mode, freq, bandE, effEnd, C, LM, st->arch);
 | 
				
			||||||
         amp2Log2(mode, effEnd, end, bandE, bandLogE, C);
 | 
					         amp2Log2(mode, effEnd, end, bandE, bandLogE, C);
 | 
				
			||||||
         /* Compensate for the scaling of short vs long mdcts */
 | 
					         /* Compensate for the scaling of short vs long mdcts */
 | 
				
			||||||
         for (i=0;i<C*nbEBands;i++)
 | 
					         for (i=0;i<C*nbEBands;i++)
 | 
				
			||||||
@@ -1757,31 +1870,59 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm,
 | 
				
			|||||||
   /* Band normalisation */
 | 
					   /* Band normalisation */
 | 
				
			||||||
   normalise_bands(mode, freq, X, bandE, effEnd, C, M);
 | 
					   normalise_bands(mode, freq, X, bandE, effEnd, C, M);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   enable_tf_analysis = effectiveBytes>=15*C && !hybrid && st->complexity>=2 && !st->lfe;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   ALLOC(offsets, nbEBands, int);
 | 
				
			||||||
 | 
					   ALLOC(importance, nbEBands, int);
 | 
				
			||||||
 | 
					   ALLOC(spread_weight, nbEBands, int);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   maxDepth = dynalloc_analysis(bandLogE, bandLogE2, nbEBands, start, end, C, offsets,
 | 
				
			||||||
 | 
					         st->lsb_depth, mode->logN, isTransient, st->vbr, st->constrained_vbr,
 | 
				
			||||||
 | 
					         eBands, LM, effectiveBytes, &tot_boost, st->lfe, surround_dynalloc, &st->analysis, importance, spread_weight);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   ALLOC(tf_res, nbEBands, int);
 | 
					   ALLOC(tf_res, nbEBands, int);
 | 
				
			||||||
   /* Disable variable tf resolution for hybrid and at very low bitrate */
 | 
					   /* Disable variable tf resolution for hybrid and at very low bitrate */
 | 
				
			||||||
   if (effectiveBytes>=15*C && start==0 && st->complexity>=2 && !st->lfe)
 | 
					   if (enable_tf_analysis)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
      int lambda;
 | 
					      int lambda;
 | 
				
			||||||
      if (effectiveBytes<40)
 | 
					      lambda = IMAX(80, 20480/effectiveBytes + 2);
 | 
				
			||||||
         lambda = 12;
 | 
					      tf_select = tf_analysis(mode, effEnd, isTransient, tf_res, lambda, X, N, LM, tf_estimate, tf_chan, importance);
 | 
				
			||||||
      else if (effectiveBytes<60)
 | 
					 | 
				
			||||||
         lambda = 6;
 | 
					 | 
				
			||||||
      else if (effectiveBytes<100)
 | 
					 | 
				
			||||||
         lambda = 4;
 | 
					 | 
				
			||||||
      else
 | 
					 | 
				
			||||||
         lambda = 3;
 | 
					 | 
				
			||||||
      lambda*=2;
 | 
					 | 
				
			||||||
      tf_select = tf_analysis(mode, effEnd, isTransient, tf_res, lambda, X, N, LM, &tf_sum, tf_estimate, tf_chan);
 | 
					 | 
				
			||||||
      for (i=effEnd;i<end;i++)
 | 
					      for (i=effEnd;i<end;i++)
 | 
				
			||||||
         tf_res[i] = tf_res[effEnd-1];
 | 
					         tf_res[i] = tf_res[effEnd-1];
 | 
				
			||||||
 | 
					   } else if (hybrid && weak_transient)
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					      /* For weak transients, we rely on the fact that improving time resolution using
 | 
				
			||||||
 | 
					         TF on a long window is imperfect and will not result in an energy collapse at
 | 
				
			||||||
 | 
					         low bitrate. */
 | 
				
			||||||
 | 
					      for (i=0;i<end;i++)
 | 
				
			||||||
 | 
					         tf_res[i] = 1;
 | 
				
			||||||
 | 
					      tf_select=0;
 | 
				
			||||||
 | 
					   } else if (hybrid && effectiveBytes<15 && st->silk_info.signalType != 2)
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					      /* For low bitrate hybrid, we force temporal resolution to 5 ms rather than 2.5 ms. */
 | 
				
			||||||
 | 
					      for (i=0;i<end;i++)
 | 
				
			||||||
 | 
					         tf_res[i] = 0;
 | 
				
			||||||
 | 
					      tf_select=isTransient;
 | 
				
			||||||
   } else {
 | 
					   } else {
 | 
				
			||||||
      tf_sum = 0;
 | 
					 | 
				
			||||||
      for (i=0;i<end;i++)
 | 
					      for (i=0;i<end;i++)
 | 
				
			||||||
         tf_res[i] = isTransient;
 | 
					         tf_res[i] = isTransient;
 | 
				
			||||||
      tf_select=0;
 | 
					      tf_select=0;
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   ALLOC(error, C*nbEBands, opus_val16);
 | 
					   ALLOC(error, C*nbEBands, opus_val16);
 | 
				
			||||||
 | 
					   c=0;
 | 
				
			||||||
 | 
					   do {
 | 
				
			||||||
 | 
					      for (i=start;i<end;i++)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					         /* When the energy is stable, slightly bias energy quantization towards
 | 
				
			||||||
 | 
					            the previous error to make the gain more stable (a constant offset is
 | 
				
			||||||
 | 
					            better than fluctuations). */
 | 
				
			||||||
 | 
					         if (ABS32(SUB32(bandLogE[i+c*nbEBands], oldBandE[i+c*nbEBands])) < QCONST16(2.f, DB_SHIFT))
 | 
				
			||||||
 | 
					         {
 | 
				
			||||||
 | 
					            bandLogE[i+c*nbEBands] -= MULT16_16_Q15(energyError[i+c*nbEBands], QCONST16(0.25f, 15));
 | 
				
			||||||
 | 
					         }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					   } while (++c < C);
 | 
				
			||||||
   quant_coarse_energy(mode, start, end, effEnd, bandLogE,
 | 
					   quant_coarse_energy(mode, start, end, effEnd, bandLogE,
 | 
				
			||||||
         oldBandE, total_bits, error, enc,
 | 
					         oldBandE, total_bits, error, enc,
 | 
				
			||||||
         C, LM, nbAvailableBytes, st->force_intra,
 | 
					         C, LM, nbAvailableBytes, st->force_intra,
 | 
				
			||||||
@@ -1795,7 +1936,15 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm,
 | 
				
			|||||||
      {
 | 
					      {
 | 
				
			||||||
         st->tapset_decision = 0;
 | 
					         st->tapset_decision = 0;
 | 
				
			||||||
         st->spread_decision = SPREAD_NORMAL;
 | 
					         st->spread_decision = SPREAD_NORMAL;
 | 
				
			||||||
      } else if (shortBlocks || st->complexity < 3 || nbAvailableBytes < 10*C || start != 0)
 | 
					      } else if (hybrid)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					         if (st->complexity == 0)
 | 
				
			||||||
 | 
					            st->spread_decision = SPREAD_NONE;
 | 
				
			||||||
 | 
					         else if (isTransient)
 | 
				
			||||||
 | 
					            st->spread_decision = SPREAD_NORMAL;
 | 
				
			||||||
 | 
					         else
 | 
				
			||||||
 | 
					            st->spread_decision = SPREAD_AGGRESSIVE;
 | 
				
			||||||
 | 
					      } else if (shortBlocks || st->complexity < 3 || nbAvailableBytes < 10*C)
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
         if (st->complexity == 0)
 | 
					         if (st->complexity == 0)
 | 
				
			||||||
            st->spread_decision = SPREAD_NONE;
 | 
					            st->spread_decision = SPREAD_NONE;
 | 
				
			||||||
@@ -1819,7 +1968,7 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm,
 | 
				
			|||||||
         {
 | 
					         {
 | 
				
			||||||
            st->spread_decision = spreading_decision(mode, X,
 | 
					            st->spread_decision = spreading_decision(mode, X,
 | 
				
			||||||
                  &st->tonal_average, st->spread_decision, &st->hf_average,
 | 
					                  &st->tonal_average, st->spread_decision, &st->hf_average,
 | 
				
			||||||
                  &st->tapset_decision, pf_on&&!shortBlocks, effEnd, C, M);
 | 
					                  &st->tapset_decision, pf_on&&!shortBlocks, effEnd, C, M, spread_weight);
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
         /*printf("%d %d\n", st->tapset_decision, st->spread_decision);*/
 | 
					         /*printf("%d %d\n", st->tapset_decision, st->spread_decision);*/
 | 
				
			||||||
         /*printf("%f %d %f %d\n\n", st->analysis.tonality, st->spread_decision, st->analysis.tonality_slope, st->tapset_decision);*/
 | 
					         /*printf("%f %d %f %d\n\n", st->analysis.tonality, st->spread_decision, st->analysis.tonality_slope, st->tapset_decision);*/
 | 
				
			||||||
@@ -1827,11 +1976,6 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm,
 | 
				
			|||||||
      ec_enc_icdf(enc, st->spread_decision, spread_icdf, 5);
 | 
					      ec_enc_icdf(enc, st->spread_decision, spread_icdf, 5);
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   ALLOC(offsets, nbEBands, int);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
   maxDepth = dynalloc_analysis(bandLogE, bandLogE2, nbEBands, start, end, C, offsets,
 | 
					 | 
				
			||||||
         st->lsb_depth, mode->logN, isTransient, st->vbr, st->constrained_vbr,
 | 
					 | 
				
			||||||
         eBands, LM, effectiveBytes, &tot_boost, st->lfe, surround_dynalloc);
 | 
					 | 
				
			||||||
   /* For LFE, everything interesting is in the first band */
 | 
					   /* For LFE, everything interesting is in the first band */
 | 
				
			||||||
   if (st->lfe)
 | 
					   if (st->lfe)
 | 
				
			||||||
      offsets[0] = IMIN(8, effectiveBytes/3);
 | 
					      offsets[0] = IMIN(8, effectiveBytes/3);
 | 
				
			||||||
@@ -1893,12 +2037,15 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm,
 | 
				
			|||||||
   alloc_trim = 5;
 | 
					   alloc_trim = 5;
 | 
				
			||||||
   if (tell+(6<<BITRES) <= total_bits - total_boost)
 | 
					   if (tell+(6<<BITRES) <= total_bits - total_boost)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
      if (st->lfe)
 | 
					      if (start > 0 || st->lfe)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					         st->stereo_saving = 0;
 | 
				
			||||||
         alloc_trim = 5;
 | 
					         alloc_trim = 5;
 | 
				
			||||||
      else
 | 
					      } else {
 | 
				
			||||||
         alloc_trim = alloc_trim_analysis(mode, X, bandLogE,
 | 
					         alloc_trim = alloc_trim_analysis(mode, X, bandLogE,
 | 
				
			||||||
            end, LM, C, N, &st->analysis, &st->stereo_saving, tf_estimate,
 | 
					            end, LM, C, N, &st->analysis, &st->stereo_saving, tf_estimate,
 | 
				
			||||||
            st->intensity, surround_trim, st->arch);
 | 
					            st->intensity, surround_trim, equiv_rate, st->arch);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
      ec_enc_icdf(enc, alloc_trim, trim_icdf, 7);
 | 
					      ec_enc_icdf(enc, alloc_trim, trim_icdf, 7);
 | 
				
			||||||
      tell = ec_tell_frac(enc);
 | 
					      tell = ec_tell_frac(enc);
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
@@ -1916,17 +2063,36 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm,
 | 
				
			|||||||
     /* Don't attempt to use more than 510 kb/s, even for frames smaller than 20 ms.
 | 
					     /* Don't attempt to use more than 510 kb/s, even for frames smaller than 20 ms.
 | 
				
			||||||
        The CELT allocator will just not be able to use more than that anyway. */
 | 
					        The CELT allocator will just not be able to use more than that anyway. */
 | 
				
			||||||
     nbCompressedBytes = IMIN(nbCompressedBytes,1275>>(3-LM));
 | 
					     nbCompressedBytes = IMIN(nbCompressedBytes,1275>>(3-LM));
 | 
				
			||||||
     base_target = vbr_rate - ((40*C+20)<<BITRES);
 | 
					     if (!hybrid)
 | 
				
			||||||
 | 
					     {
 | 
				
			||||||
 | 
					        base_target = vbr_rate - ((40*C+20)<<BITRES);
 | 
				
			||||||
 | 
					     } else {
 | 
				
			||||||
 | 
					        base_target = IMAX(0, vbr_rate - ((9*C+4)<<BITRES));
 | 
				
			||||||
 | 
					     }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
     if (st->constrained_vbr)
 | 
					     if (st->constrained_vbr)
 | 
				
			||||||
        base_target += (st->vbr_offset>>lm_diff);
 | 
					        base_target += (st->vbr_offset>>lm_diff);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
     target = compute_vbr(mode, &st->analysis, base_target, LM, equiv_rate,
 | 
					     if (!hybrid)
 | 
				
			||||||
 | 
					     {
 | 
				
			||||||
 | 
					        target = compute_vbr(mode, &st->analysis, base_target, LM, equiv_rate,
 | 
				
			||||||
           st->lastCodedBands, C, st->intensity, st->constrained_vbr,
 | 
					           st->lastCodedBands, C, st->intensity, st->constrained_vbr,
 | 
				
			||||||
           st->stereo_saving, tot_boost, tf_estimate, pitch_change, maxDepth,
 | 
					           st->stereo_saving, tot_boost, tf_estimate, pitch_change, maxDepth,
 | 
				
			||||||
           st->variable_duration, st->lfe, st->energy_mask!=NULL, surround_masking,
 | 
					           st->lfe, st->energy_mask!=NULL, surround_masking,
 | 
				
			||||||
           temporal_vbr);
 | 
					           temporal_vbr);
 | 
				
			||||||
 | 
					     } else {
 | 
				
			||||||
 | 
					        target = base_target;
 | 
				
			||||||
 | 
					        /* Tonal frames (offset<100) need more bits than noisy (offset>100) ones. */
 | 
				
			||||||
 | 
					        if (st->silk_info.offset < 100) target += 12 << BITRES >> (3-LM);
 | 
				
			||||||
 | 
					        if (st->silk_info.offset > 100) target -= 18 << BITRES >> (3-LM);
 | 
				
			||||||
 | 
					        /* Boosting bitrate on transients and vowels with significant temporal
 | 
				
			||||||
 | 
					           spikes. */
 | 
				
			||||||
 | 
					        target += (opus_int32)MULT16_16_Q14(tf_estimate-QCONST16(.25f,14), (50<<BITRES));
 | 
				
			||||||
 | 
					        /* If we have a strong transient, let's make sure it has enough bits to code
 | 
				
			||||||
 | 
					           the first two bands, so that it can use folding rather than noise. */
 | 
				
			||||||
 | 
					        if (tf_estimate > QCONST16(.7f,14))
 | 
				
			||||||
 | 
					           target = IMAX(target, 50<<BITRES);
 | 
				
			||||||
 | 
					     }
 | 
				
			||||||
     /* The current offset is removed from the target and the space used
 | 
					     /* The current offset is removed from the target and the space used
 | 
				
			||||||
        so far is added*/
 | 
					        so far is added*/
 | 
				
			||||||
     target=target+tell;
 | 
					     target=target+tell;
 | 
				
			||||||
@@ -1934,11 +2100,16 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm,
 | 
				
			|||||||
         result in the encoder running out of bits.
 | 
					         result in the encoder running out of bits.
 | 
				
			||||||
        The margin of 2 bytes ensures that none of the bust-prevention logic
 | 
					        The margin of 2 bytes ensures that none of the bust-prevention logic
 | 
				
			||||||
         in the decoder will have triggered so far. */
 | 
					         in the decoder will have triggered so far. */
 | 
				
			||||||
     min_allowed = ((tell+total_boost+(1<<(BITRES+3))-1)>>(BITRES+3)) + 2 - nbFilledBytes;
 | 
					     min_allowed = ((tell+total_boost+(1<<(BITRES+3))-1)>>(BITRES+3)) + 2;
 | 
				
			||||||
 | 
					     /* Take into account the 37 bits we need to have left in the packet to
 | 
				
			||||||
 | 
					        signal a redundant frame in hybrid mode. Creating a shorter packet would
 | 
				
			||||||
 | 
					        create an entropy coder desync. */
 | 
				
			||||||
 | 
					     if (hybrid)
 | 
				
			||||||
 | 
					        min_allowed = IMAX(min_allowed, (tell0_frac+(37<<BITRES)+total_boost+(1<<(BITRES+3))-1)>>(BITRES+3));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
     nbAvailableBytes = (target+(1<<(BITRES+2)))>>(BITRES+3);
 | 
					     nbAvailableBytes = (target+(1<<(BITRES+2)))>>(BITRES+3);
 | 
				
			||||||
     nbAvailableBytes = IMAX(min_allowed,nbAvailableBytes);
 | 
					     nbAvailableBytes = IMAX(min_allowed,nbAvailableBytes);
 | 
				
			||||||
     nbAvailableBytes = IMIN(nbCompressedBytes,nbAvailableBytes+nbFilledBytes) - nbFilledBytes;
 | 
					     nbAvailableBytes = IMIN(nbCompressedBytes,nbAvailableBytes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
     /* By how much did we "miss" the target on that frame */
 | 
					     /* By how much did we "miss" the target on that frame */
 | 
				
			||||||
     delta = target - vbr_rate;
 | 
					     delta = target - vbr_rate;
 | 
				
			||||||
@@ -1985,7 +2156,7 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm,
 | 
				
			|||||||
        st->vbr_reservoir = 0;
 | 
					        st->vbr_reservoir = 0;
 | 
				
			||||||
        /*printf ("+%d\n", adjust);*/
 | 
					        /*printf ("+%d\n", adjust);*/
 | 
				
			||||||
     }
 | 
					     }
 | 
				
			||||||
     nbCompressedBytes = IMIN(nbCompressedBytes,nbAvailableBytes+nbFilledBytes);
 | 
					     nbCompressedBytes = IMIN(nbCompressedBytes,nbAvailableBytes);
 | 
				
			||||||
     /*printf("%d\n", nbCompressedBytes*50*8);*/
 | 
					     /*printf("%d\n", nbCompressedBytes*50*8);*/
 | 
				
			||||||
     /* This moves the raw bits to take into account the new compressed size */
 | 
					     /* This moves the raw bits to take into account the new compressed size */
 | 
				
			||||||
     ec_enc_shrink(enc, nbCompressedBytes);
 | 
					     ec_enc_shrink(enc, nbCompressedBytes);
 | 
				
			||||||
@@ -2020,7 +2191,7 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm,
 | 
				
			|||||||
#endif
 | 
					#endif
 | 
				
			||||||
   if (st->lfe)
 | 
					   if (st->lfe)
 | 
				
			||||||
      signalBandwidth = 1;
 | 
					      signalBandwidth = 1;
 | 
				
			||||||
   codedBands = compute_allocation(mode, start, end, offsets, cap,
 | 
					   codedBands = clt_compute_allocation(mode, start, end, offsets, cap,
 | 
				
			||||||
         alloc_trim, &st->intensity, &dual_stereo, bits, &balance, pulses,
 | 
					         alloc_trim, &st->intensity, &dual_stereo, bits, &balance, pulses,
 | 
				
			||||||
         fine_quant, fine_priority, C, LM, enc, 1, st->lastCodedBands, signalBandwidth);
 | 
					         fine_quant, fine_priority, C, LM, enc, 1, st->lastCodedBands, signalBandwidth);
 | 
				
			||||||
   if (st->lastCodedBands)
 | 
					   if (st->lastCodedBands)
 | 
				
			||||||
@@ -2035,7 +2206,7 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm,
 | 
				
			|||||||
   quant_all_bands(1, mode, start, end, X, C==2 ? X+N : NULL, collapse_masks,
 | 
					   quant_all_bands(1, mode, start, end, X, C==2 ? X+N : NULL, collapse_masks,
 | 
				
			||||||
         bandE, pulses, shortBlocks, st->spread_decision,
 | 
					         bandE, pulses, shortBlocks, st->spread_decision,
 | 
				
			||||||
         dual_stereo, st->intensity, tf_res, nbCompressedBytes*(8<<BITRES)-anti_collapse_rsv,
 | 
					         dual_stereo, st->intensity, tf_res, nbCompressedBytes*(8<<BITRES)-anti_collapse_rsv,
 | 
				
			||||||
         balance, enc, LM, codedBands, &st->rng, st->arch);
 | 
					         balance, enc, LM, codedBands, &st->rng, st->complexity, st->arch, st->disable_inv);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   if (anti_collapse_rsv > 0)
 | 
					   if (anti_collapse_rsv > 0)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
@@ -2046,6 +2217,14 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm,
 | 
				
			|||||||
      ec_enc_bits(enc, anti_collapse_on, 1);
 | 
					      ec_enc_bits(enc, anti_collapse_on, 1);
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
   quant_energy_finalise(mode, start, end, oldBandE, error, fine_quant, fine_priority, nbCompressedBytes*8-ec_tell(enc), enc, C);
 | 
					   quant_energy_finalise(mode, start, end, oldBandE, error, fine_quant, fine_priority, nbCompressedBytes*8-ec_tell(enc), enc, C);
 | 
				
			||||||
 | 
					   OPUS_CLEAR(energyError, nbEBands*CC);
 | 
				
			||||||
 | 
					   c=0;
 | 
				
			||||||
 | 
					   do {
 | 
				
			||||||
 | 
					      for (i=start;i<end;i++)
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					         energyError[i+c*nbEBands] = MAX16(-QCONST16(0.5f, 15), MIN16(QCONST16(0.5f, 15), error[i+c*nbEBands]));
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					   } while (++c < C);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   if (silence)
 | 
					   if (silence)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
@@ -2318,10 +2497,24 @@ int opus_custom_encoder_ctl(CELTEncoder * OPUS_RESTRICT st, int request, ...)
 | 
				
			|||||||
          *value=st->lsb_depth;
 | 
					          *value=st->lsb_depth;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
      case OPUS_SET_EXPERT_FRAME_DURATION_REQUEST:
 | 
					      case OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST:
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
          opus_int32 value = va_arg(ap, opus_int32);
 | 
					          opus_int32 value = va_arg(ap, opus_int32);
 | 
				
			||||||
          st->variable_duration = value;
 | 
					          if(value<0 || value>1)
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					             goto bad_arg;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          st->disable_inv = value;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					      case OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST:
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					          opus_int32 *value = va_arg(ap, opus_int32*);
 | 
				
			||||||
 | 
					          if (!value)
 | 
				
			||||||
 | 
					          {
 | 
				
			||||||
 | 
					             goto bad_arg;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          *value = st->disable_inv;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
      case OPUS_RESET_STATE:
 | 
					      case OPUS_RESET_STATE:
 | 
				
			||||||
@@ -2365,6 +2558,13 @@ int opus_custom_encoder_ctl(CELTEncoder * OPUS_RESTRICT st, int request, ...)
 | 
				
			|||||||
            OPUS_COPY(&st->analysis, info, 1);
 | 
					            OPUS_COPY(&st->analysis, info, 1);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
 | 
					      case CELT_SET_SILK_INFO_REQUEST:
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					         SILKInfo *info = va_arg(ap, SILKInfo *);
 | 
				
			||||||
 | 
					         if (info)
 | 
				
			||||||
 | 
					            OPUS_COPY(&st->silk_info, info, 1);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
      case CELT_GET_MODE_REQUEST:
 | 
					      case CELT_GET_MODE_REQUEST:
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
         const CELTMode ** value = va_arg(ap, const CELTMode**);
 | 
					         const CELTMode ** value = va_arg(ap, const CELTMode**);
 | 
				
			||||||
@@ -49,8 +49,7 @@ int          p
 | 
				
			|||||||
   float *lpc = _lpc;
 | 
					   float *lpc = _lpc;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
   for (i = 0; i < p; i++)
 | 
					   OPUS_CLEAR(lpc, p);
 | 
				
			||||||
      lpc[i] = 0;
 | 
					 | 
				
			||||||
   if (ac[0] != 0)
 | 
					   if (ac[0] != 0)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
      for (i = 0; i < p; i++) {
 | 
					      for (i = 0; i < p; i++) {
 | 
				
			||||||
@@ -90,58 +89,40 @@ int          p
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void celt_fir_c(
 | 
					void celt_fir_c(
 | 
				
			||||||
         const opus_val16 *_x,
 | 
					         const opus_val16 *x,
 | 
				
			||||||
         const opus_val16 *num,
 | 
					         const opus_val16 *num,
 | 
				
			||||||
         opus_val16 *_y,
 | 
					         opus_val16 *y,
 | 
				
			||||||
         int N,
 | 
					         int N,
 | 
				
			||||||
         int ord,
 | 
					         int ord,
 | 
				
			||||||
         opus_val16 *mem,
 | 
					 | 
				
			||||||
         int arch)
 | 
					         int arch)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   int i,j;
 | 
					   int i,j;
 | 
				
			||||||
   VARDECL(opus_val16, rnum);
 | 
					   VARDECL(opus_val16, rnum);
 | 
				
			||||||
   VARDECL(opus_val16, x);
 | 
					 | 
				
			||||||
   SAVE_STACK;
 | 
					   SAVE_STACK;
 | 
				
			||||||
 | 
					   celt_assert(x != y);
 | 
				
			||||||
   ALLOC(rnum, ord, opus_val16);
 | 
					   ALLOC(rnum, ord, opus_val16);
 | 
				
			||||||
   ALLOC(x, N+ord, opus_val16);
 | 
					 | 
				
			||||||
   for(i=0;i<ord;i++)
 | 
					   for(i=0;i<ord;i++)
 | 
				
			||||||
      rnum[i] = num[ord-i-1];
 | 
					      rnum[i] = num[ord-i-1];
 | 
				
			||||||
   for(i=0;i<ord;i++)
 | 
					 | 
				
			||||||
      x[i] = mem[ord-i-1];
 | 
					 | 
				
			||||||
   for (i=0;i<N;i++)
 | 
					 | 
				
			||||||
      x[i+ord]=_x[i];
 | 
					 | 
				
			||||||
   for(i=0;i<ord;i++)
 | 
					 | 
				
			||||||
      mem[i] = _x[N-i-1];
 | 
					 | 
				
			||||||
#ifdef SMALL_FOOTPRINT
 | 
					 | 
				
			||||||
   (void)arch;
 | 
					 | 
				
			||||||
   for (i=0;i<N;i++)
 | 
					 | 
				
			||||||
   {
 | 
					 | 
				
			||||||
      opus_val32 sum = SHL32(EXTEND32(_x[i]), SIG_SHIFT);
 | 
					 | 
				
			||||||
      for (j=0;j<ord;j++)
 | 
					 | 
				
			||||||
      {
 | 
					 | 
				
			||||||
         sum = MAC16_16(sum,rnum[j],x[i+j]);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      _y[i] = SATURATE16(PSHR32(sum, SIG_SHIFT));
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
#else
 | 
					 | 
				
			||||||
   for (i=0;i<N-3;i+=4)
 | 
					   for (i=0;i<N-3;i+=4)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
      opus_val32 sum[4]={0,0,0,0};
 | 
					      opus_val32 sum[4];
 | 
				
			||||||
      xcorr_kernel(rnum, x+i, sum, ord, arch);
 | 
					      sum[0] = SHL32(EXTEND32(x[i  ]), SIG_SHIFT);
 | 
				
			||||||
      _y[i  ] = SATURATE16(ADD32(EXTEND32(_x[i  ]), PSHR32(sum[0], SIG_SHIFT)));
 | 
					      sum[1] = SHL32(EXTEND32(x[i+1]), SIG_SHIFT);
 | 
				
			||||||
      _y[i+1] = SATURATE16(ADD32(EXTEND32(_x[i+1]), PSHR32(sum[1], SIG_SHIFT)));
 | 
					      sum[2] = SHL32(EXTEND32(x[i+2]), SIG_SHIFT);
 | 
				
			||||||
      _y[i+2] = SATURATE16(ADD32(EXTEND32(_x[i+2]), PSHR32(sum[2], SIG_SHIFT)));
 | 
					      sum[3] = SHL32(EXTEND32(x[i+3]), SIG_SHIFT);
 | 
				
			||||||
      _y[i+3] = SATURATE16(ADD32(EXTEND32(_x[i+3]), PSHR32(sum[3], SIG_SHIFT)));
 | 
					      xcorr_kernel(rnum, x+i-ord, sum, ord, arch);
 | 
				
			||||||
 | 
					      y[i  ] = ROUND16(sum[0], SIG_SHIFT);
 | 
				
			||||||
 | 
					      y[i+1] = ROUND16(sum[1], SIG_SHIFT);
 | 
				
			||||||
 | 
					      y[i+2] = ROUND16(sum[2], SIG_SHIFT);
 | 
				
			||||||
 | 
					      y[i+3] = ROUND16(sum[3], SIG_SHIFT);
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
   for (;i<N;i++)
 | 
					   for (;i<N;i++)
 | 
				
			||||||
   {
 | 
					   {
 | 
				
			||||||
      opus_val32 sum = 0;
 | 
					      opus_val32 sum = SHL32(EXTEND32(x[i]), SIG_SHIFT);
 | 
				
			||||||
      for (j=0;j<ord;j++)
 | 
					      for (j=0;j<ord;j++)
 | 
				
			||||||
         sum = MAC16_16(sum,rnum[j],x[i+j]);
 | 
					         sum = MAC16_16(sum,rnum[j],x[i+j-ord]);
 | 
				
			||||||
      _y[i] = SATURATE16(ADD32(EXTEND32(_x[i]), PSHR32(sum, SIG_SHIFT)));
 | 
					      y[i] = ROUND16(sum, SIG_SHIFT);
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
   RESTORE_STACK;
 | 
					   RESTORE_STACK;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -167,7 +148,7 @@ void celt_iir(const opus_val32 *_x,
 | 
				
			|||||||
      {
 | 
					      {
 | 
				
			||||||
         mem[j]=mem[j-1];
 | 
					         mem[j]=mem[j-1];
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      mem[0] = ROUND16(sum,SIG_SHIFT);
 | 
					      mem[0] = SROUND16(sum, SIG_SHIFT);
 | 
				
			||||||
      _y[i] = sum;
 | 
					      _y[i] = sum;
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
@@ -196,20 +177,20 @@ void celt_iir(const opus_val32 *_x,
 | 
				
			|||||||
      xcorr_kernel(rden, y+i, sum, ord, arch);
 | 
					      xcorr_kernel(rden, y+i, sum, ord, arch);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      /* Patch up the result to compensate for the fact that this is an IIR */
 | 
					      /* Patch up the result to compensate for the fact that this is an IIR */
 | 
				
			||||||
      y[i+ord  ] = -ROUND16(sum[0],SIG_SHIFT);
 | 
					      y[i+ord  ] = -SROUND16(sum[0],SIG_SHIFT);
 | 
				
			||||||
      _y[i  ] = sum[0];
 | 
					      _y[i  ] = sum[0];
 | 
				
			||||||
      sum[1] = MAC16_16(sum[1], y[i+ord  ], den[0]);
 | 
					      sum[1] = MAC16_16(sum[1], y[i+ord  ], den[0]);
 | 
				
			||||||
      y[i+ord+1] = -ROUND16(sum[1],SIG_SHIFT);
 | 
					      y[i+ord+1] = -SROUND16(sum[1],SIG_SHIFT);
 | 
				
			||||||
      _y[i+1] = sum[1];
 | 
					      _y[i+1] = sum[1];
 | 
				
			||||||
      sum[2] = MAC16_16(sum[2], y[i+ord+1], den[0]);
 | 
					      sum[2] = MAC16_16(sum[2], y[i+ord+1], den[0]);
 | 
				
			||||||
      sum[2] = MAC16_16(sum[2], y[i+ord  ], den[1]);
 | 
					      sum[2] = MAC16_16(sum[2], y[i+ord  ], den[1]);
 | 
				
			||||||
      y[i+ord+2] = -ROUND16(sum[2],SIG_SHIFT);
 | 
					      y[i+ord+2] = -SROUND16(sum[2],SIG_SHIFT);
 | 
				
			||||||
      _y[i+2] = sum[2];
 | 
					      _y[i+2] = sum[2];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      sum[3] = MAC16_16(sum[3], y[i+ord+2], den[0]);
 | 
					      sum[3] = MAC16_16(sum[3], y[i+ord+2], den[0]);
 | 
				
			||||||
      sum[3] = MAC16_16(sum[3], y[i+ord+1], den[1]);
 | 
					      sum[3] = MAC16_16(sum[3], y[i+ord+1], den[1]);
 | 
				
			||||||
      sum[3] = MAC16_16(sum[3], y[i+ord  ], den[2]);
 | 
					      sum[3] = MAC16_16(sum[3], y[i+ord  ], den[2]);
 | 
				
			||||||
      y[i+ord+3] = -ROUND16(sum[3],SIG_SHIFT);
 | 
					      y[i+ord+3] = -SROUND16(sum[3],SIG_SHIFT);
 | 
				
			||||||
      _y[i+3] = sum[3];
 | 
					      _y[i+3] = sum[3];
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
   for (;i<N;i++)
 | 
					   for (;i<N;i++)
 | 
				
			||||||
@@ -217,7 +198,7 @@ void celt_iir(const opus_val32 *_x,
 | 
				
			|||||||
      opus_val32 sum = _x[i];
 | 
					      opus_val32 sum = _x[i];
 | 
				
			||||||
      for (j=0;j<ord;j++)
 | 
					      for (j=0;j<ord;j++)
 | 
				
			||||||
         sum -= MULT16_16(rden[j],y[i+j]);
 | 
					         sum -= MULT16_16(rden[j],y[i+j]);
 | 
				
			||||||
      y[i+ord] = ROUND16(sum,SIG_SHIFT);
 | 
					      y[i+ord] = SROUND16(sum,SIG_SHIFT);
 | 
				
			||||||
      _y[i] = sum;
 | 
					      _y[i] = sum;
 | 
				
			||||||
   }
 | 
					   }
 | 
				
			||||||
   for(i=0;i<ord;i++)
 | 
					   for(i=0;i<ord;i++)
 | 
				
			||||||
@@ -45,12 +45,11 @@ void celt_fir_c(
 | 
				
			|||||||
         opus_val16 *y,
 | 
					         opus_val16 *y,
 | 
				
			||||||
         int N,
 | 
					         int N,
 | 
				
			||||||
         int ord,
 | 
					         int ord,
 | 
				
			||||||
         opus_val16 *mem,
 | 
					 | 
				
			||||||
         int arch);
 | 
					         int arch);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if !defined(OVERRIDE_CELT_FIR)
 | 
					#if !defined(OVERRIDE_CELT_FIR)
 | 
				
			||||||
#define celt_fir(x, num, y, N, ord, mem, arch) \
 | 
					#define celt_fir(x, num, y, N, ord, arch) \
 | 
				
			||||||
    (celt_fir_c(x, num, y, N, ord, mem, arch))
 | 
					    (celt_fir_c(x, num, y, N, ord, arch))
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void celt_iir(const opus_val32 *x,
 | 
					void celt_iir(const opus_val32 *x,
 | 
				
			||||||
@@ -74,7 +74,7 @@ int log2_frac(opus_uint32 val, int frac)
 | 
				
			|||||||
/*Although derived separately, the pulse vector coding scheme is equivalent to
 | 
					/*Although derived separately, the pulse vector coding scheme is equivalent to
 | 
				
			||||||
   a Pyramid Vector Quantizer \cite{Fis86}.
 | 
					   a Pyramid Vector Quantizer \cite{Fis86}.
 | 
				
			||||||
  Some additional notes about an early version appear at
 | 
					  Some additional notes about an early version appear at
 | 
				
			||||||
   http://people.xiph.org/~tterribe/notes/cwrs.html, but the codebook ordering
 | 
					   https://people.xiph.org/~tterribe/notes/cwrs.html, but the codebook ordering
 | 
				
			||||||
   and the definitions of some terms have evolved since that was written.
 | 
					   and the definitions of some terms have evolved since that was written.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  The conversion from a pulse vector to an integer index (encoding) and back
 | 
					  The conversion from a pulse vector to an integer index (encoding) and back
 | 
				
			||||||
@@ -482,7 +482,7 @@ static opus_val32 cwrsi(int _n,int _k,opus_uint32 _i,int *_y){
 | 
				
			|||||||
      k0=_k;
 | 
					      k0=_k;
 | 
				
			||||||
      q=row[_n];
 | 
					      q=row[_n];
 | 
				
			||||||
      if(q>_i){
 | 
					      if(q>_i){
 | 
				
			||||||
        celt_assert(p>q);
 | 
					        celt_sig_assert(p>q);
 | 
				
			||||||
        _k=_n;
 | 
					        _k=_n;
 | 
				
			||||||
        do p=CELT_PVQ_U_ROW[--_k][_n];
 | 
					        do p=CELT_PVQ_U_ROW[--_k][_n];
 | 
				
			||||||
        while(p>_i);
 | 
					        while(p>_i);
 | 
				
			||||||
@@ -122,7 +122,7 @@ opus_uint32 ec_tell_frac(ec_ctx *_this);
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/* Tested exhaustively for all n and for 1<=d<=256 */
 | 
					/* Tested exhaustively for all n and for 1<=d<=256 */
 | 
				
			||||||
static OPUS_INLINE opus_uint32 celt_udiv(opus_uint32 n, opus_uint32 d) {
 | 
					static OPUS_INLINE opus_uint32 celt_udiv(opus_uint32 n, opus_uint32 d) {
 | 
				
			||||||
   celt_assert(d>0);
 | 
					   celt_sig_assert(d>0);
 | 
				
			||||||
#ifdef USE_SMALL_DIV_TABLE
 | 
					#ifdef USE_SMALL_DIV_TABLE
 | 
				
			||||||
   if (d>256)
 | 
					   if (d>256)
 | 
				
			||||||
      return n/d;
 | 
					      return n/d;
 | 
				
			||||||
@@ -138,7 +138,7 @@ static OPUS_INLINE opus_uint32 celt_udiv(opus_uint32 n, opus_uint32 d) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static OPUS_INLINE opus_int32 celt_sudiv(opus_int32 n, opus_int32 d) {
 | 
					static OPUS_INLINE opus_int32 celt_sudiv(opus_int32 n, opus_int32 d) {
 | 
				
			||||||
   celt_assert(d>0);
 | 
					   celt_sig_assert(d>0);
 | 
				
			||||||
#ifdef USE_SMALL_DIV_TABLE
 | 
					#ifdef USE_SMALL_DIV_TABLE
 | 
				
			||||||
   if (n<0)
 | 
					   if (n<0)
 | 
				
			||||||
      return -(opus_int32)celt_udiv(-n, d);
 | 
					      return -(opus_int32)celt_udiv(-n, d);
 | 
				
			||||||
@@ -85,7 +85,7 @@ int ec_dec_icdf(ec_dec *_this,const unsigned char *_icdf,unsigned _ftb);
 | 
				
			|||||||
  The bits must have been encoded with ec_enc_uint().
 | 
					  The bits must have been encoded with ec_enc_uint().
 | 
				
			||||||
  No call to ec_dec_update() is necessary after this call.
 | 
					  No call to ec_dec_update() is necessary after this call.
 | 
				
			||||||
  _ft: The number of integers that can be decoded (one more than the max).
 | 
					  _ft: The number of integers that can be decoded (one more than the max).
 | 
				
			||||||
       This must be at least one, and no more than 2**32-1.
 | 
					       This must be at least 2, and no more than 2**32-1.
 | 
				
			||||||
  Return: The decoded bits.*/
 | 
					  Return: The decoded bits.*/
 | 
				
			||||||
opus_uint32 ec_dec_uint(ec_dec *_this,opus_uint32 _ft);
 | 
					opus_uint32 ec_dec_uint(ec_dec *_this,opus_uint32 _ft);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -67,7 +67,7 @@ void ec_enc_icdf(ec_enc *_this,int _s,const unsigned char *_icdf,unsigned _ftb);
 | 
				
			|||||||
/*Encodes a raw unsigned integer in the stream.
 | 
					/*Encodes a raw unsigned integer in the stream.
 | 
				
			||||||
  _fl: The integer to encode.
 | 
					  _fl: The integer to encode.
 | 
				
			||||||
  _ft: The number of integers that can be encoded (one more than the max).
 | 
					  _ft: The number of integers that can be encoded (one more than the max).
 | 
				
			||||||
       This must be at least one, and no more than 2**32-1.*/
 | 
					       This must be at least 2, and no more than 2**32-1.*/
 | 
				
			||||||
void ec_enc_uint(ec_enc *_this,opus_uint32 _fl,opus_uint32 _ft);
 | 
					void ec_enc_uint(ec_enc *_this,opus_uint32 _fl,opus_uint32 _ft);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*Encodes a sequence of raw bits in the stream.
 | 
					/*Encodes a sequence of raw bits in the stream.
 | 
				
			||||||
@@ -59,6 +59,14 @@ extern opus_int64 celt_mips;
 | 
				
			|||||||
#define SHR(a,b) SHR32(a,b)
 | 
					#define SHR(a,b) SHR32(a,b)
 | 
				
			||||||
#define PSHR(a,b) PSHR32(a,b)
 | 
					#define PSHR(a,b) PSHR32(a,b)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Add two 32-bit values, ignore any overflows */
 | 
				
			||||||
 | 
					#define ADD32_ovflw(a,b) (celt_mips+=2,(opus_val32)((opus_uint32)(a)+(opus_uint32)(b)))
 | 
				
			||||||
 | 
					/** Subtract two 32-bit values, ignore any overflows */
 | 
				
			||||||
 | 
					#define SUB32_ovflw(a,b) (celt_mips+=2,(opus_val32)((opus_uint32)(a)-(opus_uint32)(b)))
 | 
				
			||||||
 | 
					/* Avoid MSVC warning C4146: unary minus operator applied to unsigned type */
 | 
				
			||||||
 | 
					/** Negate 32-bit value, ignore any overflows */
 | 
				
			||||||
 | 
					#define NEG32_ovflw(a) (celt_mips+=2,(opus_val32)(0-(opus_uint32)(a)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static OPUS_INLINE short NEG16(int x)
 | 
					static OPUS_INLINE short NEG16(int x)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   int res;
 | 
					   int res;
 | 
				
			||||||
@@ -227,12 +235,11 @@ static OPUS_INLINE int SHL32_(opus_int64 a, int shift, char *file, int line)
 | 
				
			|||||||
#define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift)))
 | 
					#define VSHR32(a, shift) (((shift)>0) ? SHR32(a, shift) : SHL32(a, -(shift)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ROUND16(x,a) (celt_mips--,EXTRACT16(PSHR32((x),(a))))
 | 
					#define ROUND16(x,a) (celt_mips--,EXTRACT16(PSHR32((x),(a))))
 | 
				
			||||||
 | 
					#define SROUND16(x,a) (celt_mips--,EXTRACT16(SATURATE(PSHR32(x,a), 32767)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define HALF16(x)  (SHR16(x,1))
 | 
					#define HALF16(x)  (SHR16(x,1))
 | 
				
			||||||
#define HALF32(x)  (SHR32(x,1))
 | 
					#define HALF32(x)  (SHR32(x,1))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//#define SHR(a,shift) ((a) >> (shift))
 | 
					 | 
				
			||||||
//#define SHL(a,shift) ((a) << (shift))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define ADD16(a, b) ADD16_(a, b, __FILE__, __LINE__)
 | 
					#define ADD16(a, b) ADD16_(a, b, __FILE__, __LINE__)
 | 
				
			||||||
static OPUS_INLINE short ADD16_(int a, int b, char *file, int line)
 | 
					static OPUS_INLINE short ADD16_(int a, int b, char *file, int line)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -37,16 +37,32 @@
 | 
				
			|||||||
#define MULT16_16SU(a,b) ((opus_val32)(opus_val16)(a)*(opus_val32)(opus_uint16)(b))
 | 
					#define MULT16_16SU(a,b) ((opus_val32)(opus_val16)(a)*(opus_val32)(opus_uint16)(b))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** 16x32 multiplication, followed by a 16-bit shift right. Results fits in 32 bits */
 | 
					/** 16x32 multiplication, followed by a 16-bit shift right. Results fits in 32 bits */
 | 
				
			||||||
 | 
					#if OPUS_FAST_INT64
 | 
				
			||||||
 | 
					#define MULT16_32_Q16(a,b) ((opus_val32)SHR((opus_int64)((opus_val16)(a))*(b),16))
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
#define MULT16_32_Q16(a,b) ADD32(MULT16_16((a),SHR((b),16)), SHR(MULT16_16SU((a),((b)&0x0000ffff)),16))
 | 
					#define MULT16_32_Q16(a,b) ADD32(MULT16_16((a),SHR((b),16)), SHR(MULT16_16SU((a),((b)&0x0000ffff)),16))
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** 16x32 multiplication, followed by a 16-bit shift right (round-to-nearest). Results fits in 32 bits */
 | 
					/** 16x32 multiplication, followed by a 16-bit shift right (round-to-nearest). Results fits in 32 bits */
 | 
				
			||||||
 | 
					#if OPUS_FAST_INT64
 | 
				
			||||||
 | 
					#define MULT16_32_P16(a,b) ((opus_val32)PSHR((opus_int64)((opus_val16)(a))*(b),16))
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
#define MULT16_32_P16(a,b) ADD32(MULT16_16((a),SHR((b),16)), PSHR(MULT16_16SU((a),((b)&0x0000ffff)),16))
 | 
					#define MULT16_32_P16(a,b) ADD32(MULT16_16((a),SHR((b),16)), PSHR(MULT16_16SU((a),((b)&0x0000ffff)),16))
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** 16x32 multiplication, followed by a 15-bit shift right. Results fits in 32 bits */
 | 
					/** 16x32 multiplication, followed by a 15-bit shift right. Results fits in 32 bits */
 | 
				
			||||||
 | 
					#if OPUS_FAST_INT64
 | 
				
			||||||
 | 
					#define MULT16_32_Q15(a,b) ((opus_val32)SHR((opus_int64)((opus_val16)(a))*(b),15))
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
#define MULT16_32_Q15(a,b) ADD32(SHL(MULT16_16((a),SHR((b),16)),1), SHR(MULT16_16SU((a),((b)&0x0000ffff)),15))
 | 
					#define MULT16_32_Q15(a,b) ADD32(SHL(MULT16_16((a),SHR((b),16)),1), SHR(MULT16_16SU((a),((b)&0x0000ffff)),15))
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** 32x32 multiplication, followed by a 31-bit shift right. Results fits in 32 bits */
 | 
					/** 32x32 multiplication, followed by a 31-bit shift right. Results fits in 32 bits */
 | 
				
			||||||
 | 
					#if OPUS_FAST_INT64
 | 
				
			||||||
 | 
					#define MULT32_32_Q31(a,b) ((opus_val32)SHR((opus_int64)(a)*(opus_int64)(b),31))
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
#define MULT32_32_Q31(a,b) ADD32(ADD32(SHL(MULT16_16(SHR((a),16),SHR((b),16)),1), SHR(MULT16_16SU(SHR((a),16),((b)&0x0000ffff)),15)), SHR(MULT16_16SU(SHR((b),16),((a)&0x0000ffff)),15))
 | 
					#define MULT32_32_Q31(a,b) ADD32(ADD32(SHL(MULT16_16(SHR((a),16),SHR((b),16)),1), SHR(MULT16_16SU(SHR((a),16),((b)&0x0000ffff)),15)), SHR(MULT16_16SU(SHR((b),16),((a)&0x0000ffff)),15))
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Compile-time conversion of float constant to 16-bit value */
 | 
					/** Compile-time conversion of float constant to 16-bit value */
 | 
				
			||||||
#define QCONST16(x,bits) ((opus_val16)(.5+(x)*(((opus_val32)1)<<(bits))))
 | 
					#define QCONST16(x,bits) ((opus_val16)(.5+(x)*(((opus_val32)1)<<(bits))))
 | 
				
			||||||
@@ -88,6 +104,9 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/** Shift by a and round-to-neareast 32-bit value. Result is a 16-bit value */
 | 
					/** Shift by a and round-to-neareast 32-bit value. Result is a 16-bit value */
 | 
				
			||||||
#define ROUND16(x,a) (EXTRACT16(PSHR32((x),(a))))
 | 
					#define ROUND16(x,a) (EXTRACT16(PSHR32((x),(a))))
 | 
				
			||||||
 | 
					/** Shift by a and round-to-neareast 32-bit value. Result is a saturated 16-bit value */
 | 
				
			||||||
 | 
					#define SROUND16(x,a) EXTRACT16(SATURATE(PSHR32(x,a), 32767));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** Divide by two */
 | 
					/** Divide by two */
 | 
				
			||||||
#define HALF16(x)  (SHR16(x,1))
 | 
					#define HALF16(x)  (SHR16(x,1))
 | 
				
			||||||
#define HALF32(x)  (SHR32(x,1))
 | 
					#define HALF32(x)  (SHR32(x,1))
 | 
				
			||||||
@@ -101,6 +120,14 @@
 | 
				
			|||||||
/** Subtract two 32-bit values */
 | 
					/** Subtract two 32-bit values */
 | 
				
			||||||
#define SUB32(a,b) ((opus_val32)(a)-(opus_val32)(b))
 | 
					#define SUB32(a,b) ((opus_val32)(a)-(opus_val32)(b))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** Add two 32-bit values, ignore any overflows */
 | 
				
			||||||
 | 
					#define ADD32_ovflw(a,b) ((opus_val32)((opus_uint32)(a)+(opus_uint32)(b)))
 | 
				
			||||||
 | 
					/** Subtract two 32-bit values, ignore any overflows */
 | 
				
			||||||
 | 
					#define SUB32_ovflw(a,b) ((opus_val32)((opus_uint32)(a)-(opus_uint32)(b)))
 | 
				
			||||||
 | 
					/* Avoid MSVC warning C4146: unary minus operator applied to unsigned type */
 | 
				
			||||||
 | 
					/** Negate 32-bit value, ignore any overflows */
 | 
				
			||||||
 | 
					#define NEG32_ovflw(a) ((opus_val32)(0-(opus_uint32)(a)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/** 16x16 multiplication where the result fits in 16 bits */
 | 
					/** 16x16 multiplication where the result fits in 16 bits */
 | 
				
			||||||
#define MULT16_16_16(a,b)     ((((opus_val16)(a))*((opus_val16)(b))))
 | 
					#define MULT16_16_16(a,b)     ((((opus_val16)(a))*((opus_val16)(b))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -61,7 +61,13 @@
 | 
				
			|||||||
**      the config.h file.
 | 
					**      the config.h file.
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if (HAVE_LRINTF)
 | 
					/* With GCC, when SSE is available, the fastest conversion is cvtss2si. */
 | 
				
			||||||
 | 
					#if defined(__GNUC__) && defined(__SSE__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <xmmintrin.h>
 | 
				
			||||||
 | 
					static OPUS_INLINE opus_int32 float2int(float x) {return _mm_cvt_ss2si(_mm_set_ss(x));}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#elif defined(HAVE_LRINTF)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*      These defines enable functionality introduced with the 1999 ISO C
 | 
					/*      These defines enable functionality introduced with the 1999 ISO C
 | 
				
			||||||
**      standard. They must be defined before the inclusion of math.h to
 | 
					**      standard. They must be defined before the inclusion of math.h to
 | 
				
			||||||
@@ -90,10 +96,10 @@
 | 
				
			|||||||
#include <math.h>
 | 
					#include <math.h>
 | 
				
			||||||
#define float2int(x) lrint(x)
 | 
					#define float2int(x) lrint(x)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#elif (defined(_MSC_VER) && _MSC_VER >= 1400) && defined (_M_X64)
 | 
					#elif (defined(_MSC_VER) && _MSC_VER >= 1400) && (defined(_M_X64) || (defined(_M_IX86_FP) && _M_IX86_FP >= 1))
 | 
				
			||||||
        #include <xmmintrin.h>
 | 
					        #include <xmmintrin.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        __inline long int float2int(float value)
 | 
					        static __inline long int float2int(float value)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
                return _mm_cvtss_si32(_mm_load_ss(&value));
 | 
					                return _mm_cvtss_si32(_mm_load_ss(&value));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -104,7 +110,7 @@
 | 
				
			|||||||
        **      Therefore implement OPUS_INLINE versions of these functions here.
 | 
					        **      Therefore implement OPUS_INLINE versions of these functions here.
 | 
				
			||||||
        */
 | 
					        */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        __inline long int
 | 
					        static __inline long int
 | 
				
			||||||
        float2int (float flt)
 | 
					        float2int (float flt)
 | 
				
			||||||
        {       int intgr;
 | 
					        {       int intgr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -82,8 +82,8 @@ static void kf_bfly2(
 | 
				
			|||||||
         C_SUB( Fout2[0] ,  Fout[0] , t );
 | 
					         C_SUB( Fout2[0] ,  Fout[0] , t );
 | 
				
			||||||
         C_ADDTO( Fout[0] ,  t );
 | 
					         C_ADDTO( Fout[0] ,  t );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         t.r = S_MUL(Fout2[1].r+Fout2[1].i, tw);
 | 
					         t.r = S_MUL(ADD32_ovflw(Fout2[1].r, Fout2[1].i), tw);
 | 
				
			||||||
         t.i = S_MUL(Fout2[1].i-Fout2[1].r, tw);
 | 
					         t.i = S_MUL(SUB32_ovflw(Fout2[1].i, Fout2[1].r), tw);
 | 
				
			||||||
         C_SUB( Fout2[1] ,  Fout[1] , t );
 | 
					         C_SUB( Fout2[1] ,  Fout[1] , t );
 | 
				
			||||||
         C_ADDTO( Fout[1] ,  t );
 | 
					         C_ADDTO( Fout[1] ,  t );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -92,8 +92,8 @@ static void kf_bfly2(
 | 
				
			|||||||
         C_SUB( Fout2[2] ,  Fout[2] , t );
 | 
					         C_SUB( Fout2[2] ,  Fout[2] , t );
 | 
				
			||||||
         C_ADDTO( Fout[2] ,  t );
 | 
					         C_ADDTO( Fout[2] ,  t );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         t.r = S_MUL(Fout2[3].i-Fout2[3].r, tw);
 | 
					         t.r = S_MUL(SUB32_ovflw(Fout2[3].i, Fout2[3].r), tw);
 | 
				
			||||||
         t.i = S_MUL(-Fout2[3].i-Fout2[3].r, tw);
 | 
					         t.i = S_MUL(NEG32_ovflw(ADD32_ovflw(Fout2[3].i, Fout2[3].r)), tw);
 | 
				
			||||||
         C_SUB( Fout2[3] ,  Fout[3] , t );
 | 
					         C_SUB( Fout2[3] ,  Fout[3] , t );
 | 
				
			||||||
         C_ADDTO( Fout[3] ,  t );
 | 
					         C_ADDTO( Fout[3] ,  t );
 | 
				
			||||||
         Fout += 8;
 | 
					         Fout += 8;
 | 
				
			||||||
@@ -126,10 +126,10 @@ static void kf_bfly4(
 | 
				
			|||||||
         C_ADDTO( *Fout , scratch1 );
 | 
					         C_ADDTO( *Fout , scratch1 );
 | 
				
			||||||
         C_SUB( scratch1 , Fout[1] , Fout[3] );
 | 
					         C_SUB( scratch1 , Fout[1] , Fout[3] );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         Fout[1].r = scratch0.r + scratch1.i;
 | 
					         Fout[1].r = ADD32_ovflw(scratch0.r, scratch1.i);
 | 
				
			||||||
         Fout[1].i = scratch0.i - scratch1.r;
 | 
					         Fout[1].i = SUB32_ovflw(scratch0.i, scratch1.r);
 | 
				
			||||||
         Fout[3].r = scratch0.r - scratch1.i;
 | 
					         Fout[3].r = SUB32_ovflw(scratch0.r, scratch1.i);
 | 
				
			||||||
         Fout[3].i = scratch0.i + scratch1.r;
 | 
					         Fout[3].i = ADD32_ovflw(scratch0.i, scratch1.r);
 | 
				
			||||||
         Fout+=4;
 | 
					         Fout+=4;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
   } else {
 | 
					   } else {
 | 
				
			||||||
@@ -160,10 +160,10 @@ static void kf_bfly4(
 | 
				
			|||||||
            tw3 += fstride*3;
 | 
					            tw3 += fstride*3;
 | 
				
			||||||
            C_ADDTO( *Fout , scratch[3] );
 | 
					            C_ADDTO( *Fout , scratch[3] );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Fout[m].r = scratch[5].r + scratch[4].i;
 | 
					            Fout[m].r = ADD32_ovflw(scratch[5].r, scratch[4].i);
 | 
				
			||||||
            Fout[m].i = scratch[5].i - scratch[4].r;
 | 
					            Fout[m].i = SUB32_ovflw(scratch[5].i, scratch[4].r);
 | 
				
			||||||
            Fout[m3].r = scratch[5].r - scratch[4].i;
 | 
					            Fout[m3].r = SUB32_ovflw(scratch[5].r, scratch[4].i);
 | 
				
			||||||
            Fout[m3].i = scratch[5].i + scratch[4].r;
 | 
					            Fout[m3].i = ADD32_ovflw(scratch[5].i, scratch[4].r);
 | 
				
			||||||
            ++Fout;
 | 
					            ++Fout;
 | 
				
			||||||
         }
 | 
					         }
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -191,7 +191,7 @@ static void kf_bfly3(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
   kiss_fft_cpx * Fout_beg = Fout;
 | 
					   kiss_fft_cpx * Fout_beg = Fout;
 | 
				
			||||||
#ifdef FIXED_POINT
 | 
					#ifdef FIXED_POINT
 | 
				
			||||||
   epi3.r = -16384;
 | 
					   /*epi3.r = -16384;*/ /* Unused */
 | 
				
			||||||
   epi3.i = -28378;
 | 
					   epi3.i = -28378;
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
   epi3 = st->twiddles[fstride*m];
 | 
					   epi3 = st->twiddles[fstride*m];
 | 
				
			||||||
@@ -212,18 +212,18 @@ static void kf_bfly3(
 | 
				
			|||||||
         tw1 += fstride;
 | 
					         tw1 += fstride;
 | 
				
			||||||
         tw2 += fstride*2;
 | 
					         tw2 += fstride*2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         Fout[m].r = Fout->r - HALF_OF(scratch[3].r);
 | 
					         Fout[m].r = SUB32_ovflw(Fout->r, HALF_OF(scratch[3].r));
 | 
				
			||||||
         Fout[m].i = Fout->i - HALF_OF(scratch[3].i);
 | 
					         Fout[m].i = SUB32_ovflw(Fout->i, HALF_OF(scratch[3].i));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         C_MULBYSCALAR( scratch[0] , epi3.i );
 | 
					         C_MULBYSCALAR( scratch[0] , epi3.i );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         C_ADDTO(*Fout,scratch[3]);
 | 
					         C_ADDTO(*Fout,scratch[3]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         Fout[m2].r = Fout[m].r + scratch[0].i;
 | 
					         Fout[m2].r = ADD32_ovflw(Fout[m].r, scratch[0].i);
 | 
				
			||||||
         Fout[m2].i = Fout[m].i - scratch[0].r;
 | 
					         Fout[m2].i = SUB32_ovflw(Fout[m].i, scratch[0].r);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         Fout[m].r -= scratch[0].i;
 | 
					         Fout[m].r = SUB32_ovflw(Fout[m].r, scratch[0].i);
 | 
				
			||||||
         Fout[m].i += scratch[0].r;
 | 
					         Fout[m].i = ADD32_ovflw(Fout[m].i, scratch[0].r);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         ++Fout;
 | 
					         ++Fout;
 | 
				
			||||||
      } while(--k);
 | 
					      } while(--k);
 | 
				
			||||||
@@ -282,22 +282,22 @@ static void kf_bfly5(
 | 
				
			|||||||
         C_ADD( scratch[8],scratch[2],scratch[3]);
 | 
					         C_ADD( scratch[8],scratch[2],scratch[3]);
 | 
				
			||||||
         C_SUB( scratch[9],scratch[2],scratch[3]);
 | 
					         C_SUB( scratch[9],scratch[2],scratch[3]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         Fout0->r += scratch[7].r + scratch[8].r;
 | 
					         Fout0->r = ADD32_ovflw(Fout0->r, ADD32_ovflw(scratch[7].r, scratch[8].r));
 | 
				
			||||||
         Fout0->i += scratch[7].i + scratch[8].i;
 | 
					         Fout0->i = ADD32_ovflw(Fout0->i, ADD32_ovflw(scratch[7].i, scratch[8].i));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         scratch[5].r = scratch[0].r + S_MUL(scratch[7].r,ya.r) + S_MUL(scratch[8].r,yb.r);
 | 
					         scratch[5].r = ADD32_ovflw(scratch[0].r, ADD32_ovflw(S_MUL(scratch[7].r,ya.r), S_MUL(scratch[8].r,yb.r)));
 | 
				
			||||||
         scratch[5].i = scratch[0].i + S_MUL(scratch[7].i,ya.r) + S_MUL(scratch[8].i,yb.r);
 | 
					         scratch[5].i = ADD32_ovflw(scratch[0].i, ADD32_ovflw(S_MUL(scratch[7].i,ya.r), S_MUL(scratch[8].i,yb.r)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         scratch[6].r =  S_MUL(scratch[10].i,ya.i) + S_MUL(scratch[9].i,yb.i);
 | 
					         scratch[6].r =  ADD32_ovflw(S_MUL(scratch[10].i,ya.i), S_MUL(scratch[9].i,yb.i));
 | 
				
			||||||
         scratch[6].i = -S_MUL(scratch[10].r,ya.i) - S_MUL(scratch[9].r,yb.i);
 | 
					         scratch[6].i = NEG32_ovflw(ADD32_ovflw(S_MUL(scratch[10].r,ya.i), S_MUL(scratch[9].r,yb.i)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         C_SUB(*Fout1,scratch[5],scratch[6]);
 | 
					         C_SUB(*Fout1,scratch[5],scratch[6]);
 | 
				
			||||||
         C_ADD(*Fout4,scratch[5],scratch[6]);
 | 
					         C_ADD(*Fout4,scratch[5],scratch[6]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         scratch[11].r = scratch[0].r + S_MUL(scratch[7].r,yb.r) + S_MUL(scratch[8].r,ya.r);
 | 
					         scratch[11].r = ADD32_ovflw(scratch[0].r, ADD32_ovflw(S_MUL(scratch[7].r,yb.r), S_MUL(scratch[8].r,ya.r)));
 | 
				
			||||||
         scratch[11].i = scratch[0].i + S_MUL(scratch[7].i,yb.r) + S_MUL(scratch[8].i,ya.r);
 | 
					         scratch[11].i = ADD32_ovflw(scratch[0].i, ADD32_ovflw(S_MUL(scratch[7].i,yb.r), S_MUL(scratch[8].i,ya.r)));
 | 
				
			||||||
         scratch[12].r = - S_MUL(scratch[10].i,yb.i) + S_MUL(scratch[9].i,ya.i);
 | 
					         scratch[12].r = SUB32_ovflw(S_MUL(scratch[9].i,ya.i), S_MUL(scratch[10].i,yb.i));
 | 
				
			||||||
         scratch[12].i = S_MUL(scratch[10].r,yb.i) - S_MUL(scratch[9].r,ya.i);
 | 
					         scratch[12].i = SUB32_ovflw(S_MUL(scratch[10].r,yb.i), S_MUL(scratch[9].r,ya.i));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
         C_ADD(*Fout2,scratch[11],scratch[12]);
 | 
					         C_ADD(*Fout2,scratch[11],scratch[12]);
 | 
				
			||||||
         C_SUB(*Fout3,scratch[11],scratch[12]);
 | 
					         C_SUB(*Fout3,scratch[11],scratch[12]);
 | 
				
			||||||
@@ -38,7 +38,8 @@
 | 
				
			|||||||
#include "mathops.h"
 | 
					#include "mathops.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*Compute floor(sqrt(_val)) with exact arithmetic.
 | 
					/*Compute floor(sqrt(_val)) with exact arithmetic.
 | 
				
			||||||
  This has been tested on all possible 32-bit inputs.*/
 | 
					  _val must be greater than 0.
 | 
				
			||||||
 | 
					  This has been tested on all possible 32-bit inputs greater than 0.*/
 | 
				
			||||||
unsigned isqrt32(opus_uint32 _val){
 | 
					unsigned isqrt32(opus_uint32 _val){
 | 
				
			||||||
  unsigned b;
 | 
					  unsigned b;
 | 
				
			||||||
  unsigned g;
 | 
					  unsigned g;
 | 
				
			||||||
@@ -164,7 +165,7 @@ opus_val16 celt_cos_norm(opus_val32 x)
 | 
				
			|||||||
      {
 | 
					      {
 | 
				
			||||||
         return _celt_cos_pi_2(EXTRACT16(x));
 | 
					         return _celt_cos_pi_2(EXTRACT16(x));
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
         return NEG32(_celt_cos_pi_2(EXTRACT16(65536-x)));
 | 
					         return NEG16(_celt_cos_pi_2(EXTRACT16(65536-x)));
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
   } else {
 | 
					   } else {
 | 
				
			||||||
      if (x&0x0000ffff)
 | 
					      if (x&0x0000ffff)
 | 
				
			||||||
@@ -182,7 +183,7 @@ opus_val32 celt_rcp(opus_val32 x)
 | 
				
			|||||||
   int i;
 | 
					   int i;
 | 
				
			||||||
   opus_val16 n;
 | 
					   opus_val16 n;
 | 
				
			||||||
   opus_val16 r;
 | 
					   opus_val16 r;
 | 
				
			||||||
   celt_assert2(x>0, "celt_rcp() only defined for positive values");
 | 
					   celt_sig_assert(x>0);
 | 
				
			||||||
   i = celt_ilog2(x);
 | 
					   i = celt_ilog2(x);
 | 
				
			||||||
   /* n is Q15 with range [0,1). */
 | 
					   /* n is Q15 with range [0,1). */
 | 
				
			||||||
   n = VSHR32(x,i-15)-32768;
 | 
					   n = VSHR32(x,i-15)-32768;
 | 
				
			||||||
@@ -38,11 +38,44 @@
 | 
				
			|||||||
#include "entcode.h"
 | 
					#include "entcode.h"
 | 
				
			||||||
#include "os_support.h"
 | 
					#include "os_support.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define PI 3.141592653f
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Multiplies two 16-bit fractional values. Bit-exactness of this macro is important */
 | 
					/* Multiplies two 16-bit fractional values. Bit-exactness of this macro is important */
 | 
				
			||||||
#define FRAC_MUL16(a,b) ((16384+((opus_int32)(opus_int16)(a)*(opus_int16)(b)))>>15)
 | 
					#define FRAC_MUL16(a,b) ((16384+((opus_int32)(opus_int16)(a)*(opus_int16)(b)))>>15)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unsigned isqrt32(opus_uint32 _val);
 | 
					unsigned isqrt32(opus_uint32 _val);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* CELT doesn't need it for fixed-point, by analysis.c does. */
 | 
				
			||||||
 | 
					#if !defined(FIXED_POINT) || defined(ANALYSIS_C)
 | 
				
			||||||
 | 
					#define cA 0.43157974f
 | 
				
			||||||
 | 
					#define cB 0.67848403f
 | 
				
			||||||
 | 
					#define cC 0.08595542f
 | 
				
			||||||
 | 
					#define cE ((float)PI/2)
 | 
				
			||||||
 | 
					static OPUS_INLINE float fast_atan2f(float y, float x) {
 | 
				
			||||||
 | 
					   float x2, y2;
 | 
				
			||||||
 | 
					   x2 = x*x;
 | 
				
			||||||
 | 
					   y2 = y*y;
 | 
				
			||||||
 | 
					   /* For very small values, we don't care about the answer, so
 | 
				
			||||||
 | 
					      we can just return 0. */
 | 
				
			||||||
 | 
					   if (x2 + y2 < 1e-18f)
 | 
				
			||||||
 | 
					   {
 | 
				
			||||||
 | 
					      return 0;
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					   if(x2<y2){
 | 
				
			||||||
 | 
					      float den = (y2 + cB*x2) * (y2 + cC*x2);
 | 
				
			||||||
 | 
					      return -x*y*(y2 + cA*x2) / den + (y<0 ? -cE : cE);
 | 
				
			||||||
 | 
					   }else{
 | 
				
			||||||
 | 
					      float den = (x2 + cB*y2) * (x2 + cC*y2);
 | 
				
			||||||
 | 
					      return  x*y*(x2 + cA*y2) / den + (y<0 ? -cE : cE) - (x*y<0 ? -cE : cE);
 | 
				
			||||||
 | 
					   }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#undef cA
 | 
				
			||||||
 | 
					#undef cB
 | 
				
			||||||
 | 
					#undef cC
 | 
				
			||||||
 | 
					#undef cE
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef OVERRIDE_CELT_MAXABS16
 | 
					#ifndef OVERRIDE_CELT_MAXABS16
 | 
				
			||||||
static OPUS_INLINE opus_val32 celt_maxabs16(const opus_val16 *x, int len)
 | 
					static OPUS_INLINE opus_val32 celt_maxabs16(const opus_val16 *x, int len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -80,7 +113,6 @@ static OPUS_INLINE opus_val32 celt_maxabs32(const opus_val32 *x, int len)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#ifndef FIXED_POINT
 | 
					#ifndef FIXED_POINT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define PI 3.141592653f
 | 
					 | 
				
			||||||
#define celt_sqrt(x) ((float)sqrt(x))
 | 
					#define celt_sqrt(x) ((float)sqrt(x))
 | 
				
			||||||
#define celt_rsqrt(x) (1.f/celt_sqrt(x))
 | 
					#define celt_rsqrt(x) (1.f/celt_sqrt(x))
 | 
				
			||||||
#define celt_rsqrt_norm(x) (celt_rsqrt(x))
 | 
					#define celt_rsqrt_norm(x) (celt_rsqrt(x))
 | 
				
			||||||
@@ -147,7 +179,7 @@ static OPUS_INLINE float celt_exp2(float x)
 | 
				
			|||||||
/** Integer log in base2. Undefined for zero and negative numbers */
 | 
					/** Integer log in base2. Undefined for zero and negative numbers */
 | 
				
			||||||
static OPUS_INLINE opus_int16 celt_ilog2(opus_int32 x)
 | 
					static OPUS_INLINE opus_int16 celt_ilog2(opus_int32 x)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
   celt_assert2(x>0, "celt_ilog2() only defined for strictly positive numbers");
 | 
					   celt_sig_assert(x>0);
 | 
				
			||||||
   return EC_ILOG(x)-1;
 | 
					   return EC_ILOG(x)-1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
@@ -270,8 +270,8 @@ void clt_mdct_backward_c(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_sca
 | 
				
			|||||||
         int rev;
 | 
					         int rev;
 | 
				
			||||||
         kiss_fft_scalar yr, yi;
 | 
					         kiss_fft_scalar yr, yi;
 | 
				
			||||||
         rev = *bitrev++;
 | 
					         rev = *bitrev++;
 | 
				
			||||||
         yr = S_MUL(*xp2, t[i]) + S_MUL(*xp1, t[N4+i]);
 | 
					         yr = ADD32_ovflw(S_MUL(*xp2, t[i]), S_MUL(*xp1, t[N4+i]));
 | 
				
			||||||
         yi = S_MUL(*xp1, t[i]) - S_MUL(*xp2, t[N4+i]);
 | 
					         yi = SUB32_ovflw(S_MUL(*xp1, t[i]), S_MUL(*xp2, t[N4+i]));
 | 
				
			||||||
         /* We swap real and imag because we use an FFT instead of an IFFT. */
 | 
					         /* We swap real and imag because we use an FFT instead of an IFFT. */
 | 
				
			||||||
         yp[2*rev+1] = yr;
 | 
					         yp[2*rev+1] = yr;
 | 
				
			||||||
         yp[2*rev] = yi;
 | 
					         yp[2*rev] = yi;
 | 
				
			||||||
@@ -301,8 +301,8 @@ void clt_mdct_backward_c(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_sca
 | 
				
			|||||||
         t0 = t[i];
 | 
					         t0 = t[i];
 | 
				
			||||||
         t1 = t[N4+i];
 | 
					         t1 = t[N4+i];
 | 
				
			||||||
         /* We'd scale up by 2 here, but instead it's done when mixing the windows */
 | 
					         /* We'd scale up by 2 here, but instead it's done when mixing the windows */
 | 
				
			||||||
         yr = S_MUL(re,t0) + S_MUL(im,t1);
 | 
					         yr = ADD32_ovflw(S_MUL(re,t0), S_MUL(im,t1));
 | 
				
			||||||
         yi = S_MUL(re,t1) - S_MUL(im,t0);
 | 
					         yi = SUB32_ovflw(S_MUL(re,t1), S_MUL(im,t0));
 | 
				
			||||||
         /* We swap real and imag because we're using an FFT instead of an IFFT. */
 | 
					         /* We swap real and imag because we're using an FFT instead of an IFFT. */
 | 
				
			||||||
         re = yp1[1];
 | 
					         re = yp1[1];
 | 
				
			||||||
         im = yp1[0];
 | 
					         im = yp1[0];
 | 
				
			||||||
@@ -312,8 +312,8 @@ void clt_mdct_backward_c(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_sca
 | 
				
			|||||||
         t0 = t[(N4-i-1)];
 | 
					         t0 = t[(N4-i-1)];
 | 
				
			||||||
         t1 = t[(N2-i-1)];
 | 
					         t1 = t[(N2-i-1)];
 | 
				
			||||||
         /* We'd scale up by 2 here, but instead it's done when mixing the windows */
 | 
					         /* We'd scale up by 2 here, but instead it's done when mixing the windows */
 | 
				
			||||||
         yr = S_MUL(re,t0) + S_MUL(im,t1);
 | 
					         yr = ADD32_ovflw(S_MUL(re,t0), S_MUL(im,t1));
 | 
				
			||||||
         yi = S_MUL(re,t1) - S_MUL(im,t0);
 | 
					         yi = SUB32_ovflw(S_MUL(re,t1), S_MUL(im,t0));
 | 
				
			||||||
         yp1[0] = yr;
 | 
					         yp1[0] = yr;
 | 
				
			||||||
         yp0[1] = yi;
 | 
					         yp0[1] = yi;
 | 
				
			||||||
         yp0 += 2;
 | 
					         yp0 += 2;
 | 
				
			||||||
@@ -333,8 +333,8 @@ void clt_mdct_backward_c(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_sca
 | 
				
			|||||||
         kiss_fft_scalar x1, x2;
 | 
					         kiss_fft_scalar x1, x2;
 | 
				
			||||||
         x1 = *xp1;
 | 
					         x1 = *xp1;
 | 
				
			||||||
         x2 = *yp1;
 | 
					         x2 = *yp1;
 | 
				
			||||||
         *yp1++ = MULT16_32_Q15(*wp2, x2) - MULT16_32_Q15(*wp1, x1);
 | 
					         *yp1++ = SUB32_ovflw(MULT16_32_Q15(*wp2, x2), MULT16_32_Q15(*wp1, x1));
 | 
				
			||||||
         *xp1-- = MULT16_32_Q15(*wp1, x2) + MULT16_32_Q15(*wp2, x1);
 | 
					         *xp1-- = ADD32_ovflw(MULT16_32_Q15(*wp1, x2), MULT16_32_Q15(*wp2, x1));
 | 
				
			||||||
         wp1++;
 | 
					         wp1++;
 | 
				
			||||||
         wp2--;
 | 
					         wp2--;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
@@ -53,6 +53,7 @@
 | 
				
			|||||||
#include "celt_lpc.h"
 | 
					#include "celt_lpc.h"
 | 
				
			||||||
#include "vq.h"
 | 
					#include "vq.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define OVERRIDE_COMB_FILTER_CONST
 | 
				
			||||||
#define OVERRIDE_comb_filter
 | 
					#define OVERRIDE_comb_filter
 | 
				
			||||||
void comb_filter(opus_val32 *y, opus_val32 *x, int T0, int T1, int N,
 | 
					void comb_filter(opus_val32 *y, opus_val32 *x, int T0, int T1, int N,
 | 
				
			||||||
      opus_val16 g0, opus_val16 g1, int tapset0, int tapset1,
 | 
					      opus_val16 g0, opus_val16 g1, int tapset0, int tapset1,
 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user