mirror of
				https://github.com/musix-org/musix-oss
				synced 2025-10-31 17:51:36 +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 | ||||
| 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 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 PACKAGE_TARNAME "opus" | ||||
| @@ -161,7 +161,7 @@ | ||||
| #define PACKAGE_URL "" | ||||
| 
 | ||||
| /* 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 STDC_HEADERS 1 | ||||
| @@ -153,7 +153,7 @@ | ||||
| #define PACKAGE_NAME "opus" | ||||
| 
 | ||||
| /* 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 PACKAGE_TARNAME "opus" | ||||
| @@ -162,7 +162,7 @@ | ||||
| #define PACKAGE_URL "" | ||||
| 
 | ||||
| /* 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 STDC_HEADERS 1 | ||||
| @@ -132,7 +132,7 @@ | ||||
| #define PACKAGE_NAME "opus" | ||||
| 
 | ||||
| /* 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 PACKAGE_TARNAME "opus" | ||||
| @@ -141,7 +141,7 @@ | ||||
| #define PACKAGE_URL "" | ||||
| 
 | ||||
| /* 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 STDC_HEADERS 1 | ||||
| @@ -152,7 +152,7 @@ | ||||
| #define PACKAGE_NAME "opus" | ||||
| 
 | ||||
| /* 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 PACKAGE_TARNAME "opus" | ||||
| @@ -161,7 +161,7 @@ | ||||
| #define PACKAGE_URL "" | ||||
| 
 | ||||
| /* 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 STDC_HEADERS 1 | ||||
| @@ -128,7 +128,7 @@ | ||||
| #define PACKAGE_NAME "opus" | ||||
| 
 | ||||
| /* 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 PACKAGE_TARNAME "opus" | ||||
| @@ -137,7 +137,7 @@ | ||||
| #define PACKAGE_URL "" | ||||
| 
 | ||||
| /* 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 STDC_HEADERS 1 | ||||
| @@ -129,7 +129,7 @@ | ||||
| #define PACKAGE_NAME "opus" | ||||
| 
 | ||||
| /* 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 PACKAGE_TARNAME "opus" | ||||
| @@ -138,7 +138,7 @@ | ||||
| #define PACKAGE_URL "" | ||||
| 
 | ||||
| /* 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 STDC_HEADERS 1 | ||||
| @@ -128,7 +128,7 @@ | ||||
| #define PACKAGE_NAME "opus" | ||||
| 
 | ||||
| /* 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 PACKAGE_TARNAME "opus" | ||||
| @@ -137,7 +137,7 @@ | ||||
| #define PACKAGE_URL "" | ||||
| 
 | ||||
| /* 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 STDC_HEADERS 1 | ||||
| @@ -28,8 +28,6 @@ POSSIBILITY OF SUCH DAMAGE. | ||||
| #ifndef CONFIG_H | ||||
| #define CONFIG_H | ||||
| 
 | ||||
| #define inline __inline | ||||
| 
 | ||||
| #define USE_ALLOCA            1 | ||||
| 
 | ||||
| /* Comment out the next line for floating-point code */ | ||||
| @@ -37,16 +35,30 @@ POSSIBILITY OF SUCH DAMAGE. | ||||
| 
 | ||||
| #define OPUS_BUILD            1 | ||||
| 
 | ||||
| /* Get rid of the CELT VS compile warnings */ | ||||
| #if 1 | ||||
| #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. */ | ||||
| #if defined(_M_IX86) || defined(_M_X64) | ||||
| /* Can always compile SSE intrinsics (no special compiler flags necessary) */ | ||||
| /* #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 | ||||
| 
 | ||||
| /* Enable SSE functions, if compiled with SSE/SSE2 (note that AMD64 implies SSE2) */ | ||||
| #if defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP >= 1)) | ||||
| #define __SSE__               1 | ||||
| #if !defined(OPUS_X86_PRESUME_SSE4_1) || !defined(OPUS_X86_PRESUME_SSE2) || !defined(OPUS_X86_PRESUME_SSE) | ||||
| #define OPUS_HAVE_RTCD 1 | ||||
| #endif | ||||
| 
 | ||||
| #include "version.h" | ||||
| #endif | ||||
| 
 | ||||
| #define PACKAGE_VERSION "1.3.1" | ||||
| 
 | ||||
| #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 | ||||
| SILK_SOURCES += $(SILK_SOURCES_SSE4_1) $(SILK_SOURCES_FIXED_SSE4_1) | ||||
| endif | ||||
| if HAVE_ARM_NEON_INTR | ||||
| SILK_SOURCES += $(SILK_SOURCES_FIXED_ARM_NEON_INTR) | ||||
| endif | ||||
| else | ||||
| SILK_SOURCES += $(SILK_SOURCES_FLOAT) | ||||
| if HAVE_SSE4_1 | ||||
| @@ -47,8 +50,9 @@ if CPU_ARM | ||||
| CELT_SOURCES += $(CELT_SOURCES_ARM) | ||||
| SILK_SOURCES += $(SILK_SOURCES_ARM) | ||||
| 
 | ||||
| if OPUS_ARM_NEON_INTR | ||||
| if HAVE_ARM_NEON_INTR | ||||
| CELT_SOURCES += $(CELT_SOURCES_ARM_NEON_INTR) | ||||
| SILK_SOURCES += $(SILK_SOURCES_ARM_NEON_INTR) | ||||
| endif | ||||
| 
 | ||||
| if HAVE_ARM_NE10 | ||||
| @@ -78,14 +82,43 @@ if OPUS_ARM_EXTERNAL_ASM | ||||
| libopus_la_LIBADD += libarmasm.la | ||||
| 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) | ||||
| 
 | ||||
| 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 | ||||
| 
 | ||||
| @@ -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_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_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_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_LDADD = $(LIBM) | ||||
| 
 | ||||
| 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 | ||||
| celt_tests_test_unit_dft_LDADD += libarmasm.la | ||||
| 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_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 | ||||
| celt_tests_test_unit_mathops_LDADD += libarmasm.la | ||||
| endif | ||||
| 
 | ||||
| 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 | ||||
| celt_tests_test_unit_mdct_LDADD += libarmasm.la | ||||
| endif | ||||
| 
 | ||||
| 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 | ||||
| celt_tests_test_unit_rotation_LDADD += libarmasm.la | ||||
| endif | ||||
| @@ -156,34 +205,32 @@ opus_custom_demo_LDADD = libopus.la $(LIBM) | ||||
| endif | ||||
| endif | ||||
| 
 | ||||
| EXTRA_DIST = version.mk \
 | ||||
|              opus.pc.in \
 | ||||
| EXTRA_DIST = opus.pc.in \
 | ||||
|              opus-uninstalled.pc.in \
 | ||||
|              opus.m4 \
 | ||||
|              Makefile.mips \
 | ||||
|              Makefile.unix \
 | ||||
|              CMakeLists.txt \
 | ||||
|              config.h.cmake.in \
 | ||||
|              opus_config.cmake \
 | ||||
|              opus_functions.cmake \
 | ||||
|              opus_sources.cmake \
 | ||||
|              OpusConfig.cmake.in \
 | ||||
|              tests/run_vectors.sh \
 | ||||
|              celt/arm/arm2gnu.pl \
 | ||||
|              celt/arm/celt_pitch_xcorr_arm.s \
 | ||||
|              win32/VS2010/silk_float.vcxproj \
 | ||||
|              win32/VS2010/celt.vcxproj.filters \
 | ||||
|              win32/VS2010/opus.vcxproj \
 | ||||
|              win32/VS2010/silk_common.vcxproj.filters \
 | ||||
|              win32/VS2010/silk_float.vcxproj.filters \
 | ||||
|              win32/VS2010/test_opus_encode.vcxproj.filters \
 | ||||
|              win32/VS2010/silk_common.vcxproj \
 | ||||
|              win32/VS2010/test_opus_encode.vcxproj \
 | ||||
|              win32/VS2010/opus_demo.vcxproj \
 | ||||
|              win32/VS2010/test_opus_api.vcxproj.filters \
 | ||||
|              win32/VS2010/test_opus_api.vcxproj \
 | ||||
|              win32/VS2010/test_opus_decode.vcxproj.filters \
 | ||||
|              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/VS2015/opus.vcxproj \
 | ||||
|              win32/VS2015/test_opus_encode.vcxproj.filters \
 | ||||
|              win32/VS2015/test_opus_encode.vcxproj \
 | ||||
|              win32/VS2015/opus_demo.vcxproj \
 | ||||
|              win32/VS2015/test_opus_api.vcxproj.filters \
 | ||||
|              win32/VS2015/test_opus_api.vcxproj \
 | ||||
|              win32/VS2015/test_opus_decode.vcxproj.filters \
 | ||||
|              win32/VS2015/opus_demo.vcxproj.filters \
 | ||||
|              win32/VS2015/opus.vcxproj.filters \
 | ||||
|              win32/VS2015/test_opus_decode.vcxproj \
 | ||||
|              win32/VS2015/opus.sln \
 | ||||
|              win32/VS2015/common.props \
 | ||||
|              win32/genversion.bat \
 | ||||
|              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) \
 | ||||
|                     $(celt_tests_test_unit_rotation_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 | ||||
| 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 | ||||
| 
 | ||||
| if HAVE_SSE2 | ||||
| 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 | ||||
| 
 | ||||
| if HAVE_SSE4_1 | ||||
| SSE4_1_OBJ = $(CELT_SOURCES_SSE4_1:.c=.lo) \
 | ||||
|              $(SILK_SOURCES_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 | ||||
| 
 | ||||
| if OPUS_ARM_NEON_INTR | ||||
| CELT_ARM_NEON_INTR_OBJ = $(CELT_SOURCES_ARM_NEON_INTR:.c=.lo) | ||||
| $(CELT_ARM_NEON_INTR_OBJ) $(OPT_UNIT_TEST_OBJ): CFLAGS += \ | ||||
| if HAVE_ARM_NEON_INTR | ||||
| ARM_NEON_INTR_OBJ = $(CELT_SOURCES_ARM_NEON_INTR:.c=.lo) \
 | ||||
|                     $(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) | ||||
| endif | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -12,7 +12,7 @@ CFLAGS := -DUSE_ALLOCA $(CFLAGS) | ||||
| 
 | ||||
| # These options affect performance
 | ||||
| # HAVE_LRINTF: Use C99 intrinsics to speed up float-to-int conversion
 | ||||
| #CFLAGS := -DHAVE_LRINTF $(CFLAGS)
 | ||||
| CFLAGS := -DHAVE_LRINTF $(CFLAGS) | ||||
| 
 | ||||
| ###################### END OF OPTIONS ######################
 | ||||
| 
 | ||||
| @@ -99,7 +99,7 @@ TESTOPUSAPI_OBJS := $(patsubst %.c,%$(OBJSUFFIX),$(TESTOPUSAPI_SRCS_C)) | ||||
| TESTOPUSDECODE_SRCS_C = tests/test_opus_decode.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)) | ||||
| 
 | ||||
| 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_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)) | ||||
| 
 | ||||
| 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) | ||||
							
								
								
									
										29
									
								
								node_modules/node-opus/deps/opus/README → node_modules/@discordjs/opus/deps/opus/README
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										29
									
								
								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 | ||||
| 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 | ||||
| Ogg encapsulated Opus files and includes a number of useful features. | ||||
| @@ -48,6 +48,24 @@ To build from a distribution tarball, you only need to do the following: | ||||
| 
 | ||||
| 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: | ||||
| 
 | ||||
|     % git clone https://git.xiph.org/opus.git | ||||
| @@ -102,17 +120,18 @@ which SHOULD be run after compiling the package especially the first | ||||
| time it is run on a new platform. | ||||
| 
 | ||||
| To run the integrated tests: | ||||
| 
 | ||||
|     % make check | ||||
| 
 | ||||
| There is also collection of standard test vectors which are not | ||||
| 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: | ||||
| 
 | ||||
| % curl -O https://opus-codec.org/testvectors/opus_testvectors.tar.gz | ||||
| % tar -zxf opus_testvectors.tar.gz | ||||
| % ./tests/run_vectors.sh ./ opus_testvectors 48000 | ||||
|     % curl -OL https://opus-codec.org/docs/opus_testvectors-rfc8251.tar.gz | ||||
|     % tar -zxf opus_testvectors-rfc8251.tar.gz | ||||
|     % ./tests/run_vectors.sh ./ opus_newvectors 48000 | ||||
| 
 | ||||
| == 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 | ||||
| # 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. | ||||
| 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 | ||||
| # gives unlimited permission to copy and/or distribute it, | ||||
| @@ -35,7 +35,7 @@ AC_DEFUN([AM_AUTOMAKE_VERSION], | ||||
| [am__api_version='1.15' | ||||
| dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to | ||||
| dnl require some minimum version.  Point them to the right macro. | ||||
| m4_if([$1], [1.15], [], | ||||
| m4_if([$1], [1.15.1], [], | ||||
|       [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. | ||||
| # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. | ||||
| 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_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl | ||||
| _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) | ||||
| 
 | ||||
| # 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 | ||||
| # 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 -*- | ||||
| 
 | ||||
| # 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 | ||||
| # gives unlimited permission to copy and/or distribute it, | ||||
| @@ -130,7 +130,7 @@ am_aux_dir=`cd "$ac_aux_dir" && pwd` | ||||
| 
 | ||||
| # 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 | ||||
| # 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.]]) | ||||
| 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 | ||||
| # 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 -*- | ||||
| 
 | ||||
| # 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 | ||||
| # 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 -*- | ||||
| 
 | ||||
| # 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 | ||||
| # gives unlimited permission to copy and/or distribute it, | ||||
| @@ -625,7 +625,7 @@ for _am_header in $config_headers :; do | ||||
| done | ||||
| 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 | ||||
| # gives unlimited permission to copy and/or distribute it, | ||||
| @@ -646,7 +646,7 @@ if test x"${install_sh+set}" != xset; then | ||||
| fi | ||||
| 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 | ||||
| # 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 -*- | ||||
| # 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 | ||||
| # 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 -*- | ||||
| 
 | ||||
| # 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 | ||||
| # 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 -*- | ||||
| 
 | ||||
| # 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 | ||||
| # gives unlimited permission to copy and/or distribute it, | ||||
| @@ -792,7 +792,7 @@ fi | ||||
| 
 | ||||
| # 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 | ||||
| # gives unlimited permission to copy and/or distribute it, | ||||
| @@ -821,7 +821,7 @@ AC_DEFUN([_AM_SET_OPTIONS], | ||||
| AC_DEFUN([_AM_IF_OPTION], | ||||
| [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 | ||||
| # gives unlimited permission to copy and/or distribute it, | ||||
| @@ -868,7 +868,7 @@ AC_LANG_POP([C])]) | ||||
| # For backward compatibility. | ||||
| 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 | ||||
| # 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 -*- | ||||
| 
 | ||||
| # 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 | ||||
| # gives unlimited permission to copy and/or distribute it, | ||||
| @@ -968,7 +968,7 @@ AC_CONFIG_COMMANDS_PRE( | ||||
| 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 | ||||
| # gives unlimited permission to copy and/or distribute it, | ||||
| @@ -1028,7 +1028,7 @@ AC_SUBST([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 | ||||
| # gives unlimited permission to copy and/or distribute it, | ||||
| @@ -1056,7 +1056,7 @@ fi | ||||
| INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" | ||||
| 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 | ||||
| # 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 -*- | ||||
| 
 | ||||
| # 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 | ||||
| # gives unlimited permission to copy and/or distribute it, | ||||
| @@ -1207,6 +1207,7 @@ AC_SUBST([am__untar]) | ||||
| ]) # _AM_PROG_TAR | ||||
| 
 | ||||
| m4_include([m4/as-gcc-inline-assembly.m4]) | ||||
| m4_include([m4/ax_add_fortify_source.m4]) | ||||
| m4_include([m4/libtool.m4]) | ||||
| m4_include([m4/ltoptions.m4]) | ||||
| m4_include([m4/ltsugar.m4]) | ||||
| @@ -58,12 +58,12 @@ | ||||
| #   define S_MUL(a,b) MULT16_32_Q15(b, a) | ||||
| 
 | ||||
| #   define C_MUL(m,a,b) \ | ||||
|       do{ (m).r = SUB32(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) | ||||
|       do{ (m).r = SUB32_ovflw(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \ | ||||
|           (m).i = ADD32_ovflw(S_MUL((a).r,(b).i) , S_MUL((a).i,(b).r)); }while(0) | ||||
| 
 | ||||
| #   define C_MULC(m,a,b) \ | ||||
|       do{ (m).r = ADD32(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) | ||||
|       do{ (m).r = ADD32_ovflw(S_MUL((a).r,(b).r) , S_MUL((a).i,(b).i)); \ | ||||
|           (m).i = SUB32_ovflw(S_MUL((a).i,(b).r) , S_MUL((a).r,(b).i)); }while(0) | ||||
| 
 | ||||
| #   define C_MULBYSCALAR( c, s ) \ | ||||
|       do{ (c).r =  S_MUL( (c).r , s ) ;\ | ||||
| @@ -77,17 +77,17 @@ | ||||
|                 DIVSCALAR( (c).i  , div); }while (0) | ||||
| 
 | ||||
| #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) | ||||
| #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) | ||||
| #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) | ||||
| 
 | ||||
| #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) | ||||
| 
 | ||||
| #if defined(OPUS_ARM_INLINE_ASM) | ||||
| @@ -46,25 +46,50 @@ | ||||
| #  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_fatal(str) _celt_fatal(str, __FILE__, __LINE__); | ||||
| #ifdef ENABLE_ASSERTIONS | ||||
| #define CELT_FATAL(str) celt_fatal(str, __FILE__, __LINE__); | ||||
| 
 | ||||
| #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 <stdlib.h> | ||||
| #ifdef __GNUC__ | ||||
| __attribute__((noreturn)) | ||||
| #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); | ||||
|    abort(); | ||||
| } | ||||
| #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);}} | ||||
| #endif | ||||
| 
 | ||||
| #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 | ||||
| #define celt_assert(cond) | ||||
| #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 | ||||
| 
 | ||||
| #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 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) | ||||
| 
 | ||||
| #ifdef FIXED_POINT | ||||
| 
 | ||||
| typedef opus_int16 opus_val16; | ||||
| typedef opus_int32 opus_val32; | ||||
| typedef opus_int64 opus_val64; | ||||
| 
 | ||||
| typedef opus_val32 celt_sig; | ||||
| typedef opus_val16 celt_norm; | ||||
| typedef opus_val32 celt_ener; | ||||
| 
 | ||||
| #define celt_isnan(x) 0 | ||||
| 
 | ||||
| #define Q15ONE 32767 | ||||
| 
 | ||||
| #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 | ||||
| 
 | ||||
| @@ -118,7 +158,9 @@ static OPUS_INLINE opus_int16 SAT16(opus_int32 x) { | ||||
| 
 | ||||
| #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" | ||||
| #elif defined (OPUS_ARM_INLINE_ASM) | ||||
| #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_val32; | ||||
| typedef float opus_val64; | ||||
| 
 | ||||
| typedef float celt_sig; | ||||
| typedef float celt_norm; | ||||
| @@ -175,6 +218,7 @@ static OPUS_INLINE int celt_isnan(float x) | ||||
| 
 | ||||
| #define NEG16(x) (-(x)) | ||||
| #define NEG32(x) (-(x)) | ||||
| #define NEG32_ovflw(x) (-(x)) | ||||
| #define EXTRACT16(x) (x) | ||||
| #define EXTEND32(x) (x) | ||||
| #define SHR16(a,shift) (a) | ||||
| @@ -191,6 +235,7 @@ static OPUS_INLINE int celt_isnan(float x) | ||||
| #define SATURATE16(x)   (x) | ||||
| 
 | ||||
| #define ROUND16(a,shift)  (a) | ||||
| #define SROUND16(a,shift) (a) | ||||
| #define HALF16(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 ADD32(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(a,b)     ((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 | ||||
| #ifdef FIXED_POINT | ||||
| #define GLOBAL_STACK_SIZE 100000 | ||||
| #define GLOBAL_STACK_SIZE 120000 | ||||
| #else | ||||
| #define GLOBAL_STACK_SIZE 100000 | ||||
| #define GLOBAL_STACK_SIZE 120000 | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| @@ -164,11 +164,11 @@ while (<>) { | ||||
|         $prefix = ""; | ||||
|         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). | ||||
|             # We handle mangling the label here, make sure it doesn't match | ||||
|             # the label handling below (if $prefix would be empty). | ||||
|             $prefix = "; "; | ||||
|             $prefix = $prefix."; "; | ||||
|             push(@proc_stack, $proc); | ||||
|             s/^[A-Za-z_\.]\w+/$symprefix$&:/; | ||||
|         } | ||||
| @@ -35,18 +35,40 @@ | ||||
| 
 | ||||
| #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(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 *, | ||||
|     const opus_val16 *, opus_val32 *, int , int) = { | ||||
|     const opus_val16 *, opus_val32 *, int, int, int) = { | ||||
|   celt_pitch_xcorr_c,               /* ARMv4 */ | ||||
|   MAY_HAVE_EDSP(celt_pitch_xcorr),  /* EDSP */ | ||||
|   MAY_HAVE_MEDIA(celt_pitch_xcorr), /* Media */ | ||||
|   MAY_HAVE_NEON(celt_pitch_xcorr)   /* NEON */ | ||||
| }; | ||||
| 
 | ||||
| #  endif | ||||
| # 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 *, | ||||
|     const opus_val16 *, opus_val32 *, int, int) = { | ||||
|     const opus_val16 *, opus_val32 *, int, int, int) = { | ||||
|   celt_pitch_xcorr_c,              /* ARMv4 */ | ||||
|   celt_pitch_xcorr_c,              /* EDSP */ | ||||
|   celt_pitch_xcorr_c,              /* Media */ | ||||
| @@ -55,6 +77,23 @@ void (*const CELT_PITCH_XCORR_IMPL[OPUS_ARCHMASK+1])(const opus_val16 *, | ||||
| #  endif | ||||
| # 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(HAVE_ARM_NE10) | ||||
| #   if defined(CUSTOM_MODES) | ||||
| @@ -37,11 +37,12 @@ | ||||
| #include "cpu_support.h" | ||||
| #include "os_support.h" | ||||
| #include "opus_types.h" | ||||
| #include "arch.h" | ||||
| 
 | ||||
| #define OPUS_CPU_ARM_V4    (1) | ||||
| #define OPUS_CPU_ARM_EDSP  (1<<1) | ||||
| #define OPUS_CPU_ARM_MEDIA (1<<2) | ||||
| #define OPUS_CPU_ARM_NEON  (1<<3) | ||||
| #define OPUS_CPU_ARM_V4_FLAG    (1<<OPUS_ARCH_ARM_V4) | ||||
| #define OPUS_CPU_ARM_EDSP_FLAG  (1<<OPUS_ARCH_ARM_EDSP) | ||||
| #define OPUS_CPU_ARM_MEDIA_FLAG (1<<OPUS_ARCH_ARM_MEDIA) | ||||
| #define OPUS_CPU_ARM_NEON_FLAG  (1<<OPUS_ARCH_ARM_NEON) | ||||
| 
 | ||||
| #if defined(_MSC_VER) | ||||
| /*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
 | ||||
|    * instructions via their assembled hex code. | ||||
|    * 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{ | ||||
|     /*PLD [r13]*/ | ||||
|     __emit(0xF5DDF000); | ||||
|     flags|=OPUS_CPU_ARM_EDSP; | ||||
|     flags|=OPUS_CPU_ARM_EDSP_FLAG; | ||||
|   } | ||||
|   __except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION){ | ||||
|     /*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{ | ||||
|     /*SHADD8 r3,r3,r3*/ | ||||
|     __emit(0xE6333F93); | ||||
|     flags|=OPUS_CPU_ARM_MEDIA; | ||||
|     flags|=OPUS_CPU_ARM_MEDIA_FLAG; | ||||
|   } | ||||
|   __except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION){ | ||||
|     /*Ignore exception.*/ | ||||
| @@ -77,7 +80,7 @@ static OPUS_INLINE opus_uint32 opus_cpu_capabilities(void){ | ||||
|   __try{ | ||||
|     /*VORR q0,q0,q0*/ | ||||
|     __emit(0xF2200150); | ||||
|     flags|=OPUS_CPU_ARM_NEON; | ||||
|     flags|=OPUS_CPU_ARM_NEON_FLAG; | ||||
|   } | ||||
|   __except(GetExceptionCode()==EXCEPTION_ILLEGAL_INSTRUCTION){ | ||||
|     /*Ignore exception.*/ | ||||
| @@ -107,26 +110,26 @@ opus_uint32 opus_cpu_capabilities(void) | ||||
| 
 | ||||
|     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 */ | ||||
|       if(memcmp(buf, "Features", 8) == 0) | ||||
|       { | ||||
|         char *p; | ||||
| #  if defined(OPUS_ARM_MAY_HAVE_EDSP) | ||||
|         p = strstr(buf, " edsp"); | ||||
|         if(p != NULL && (p[5] == ' ' || p[5] == '\n')) | ||||
|           flags |= OPUS_CPU_ARM_EDSP; | ||||
| #  endif | ||||
|           flags |= OPUS_CPU_ARM_EDSP_FLAG; | ||||
| 
 | ||||
| #  if defined(OPUS_ARM_MAY_HAVE_NEON) || defined(OPUS_ARM_MAY_HAVE_NEON_INTR) | ||||
|         p = strstr(buf, " neon"); | ||||
|         if(p != NULL && (p[5] == ' ' || p[5] == '\n')) | ||||
|           flags |= OPUS_CPU_ARM_NEON; | ||||
|           flags |= OPUS_CPU_ARM_NEON_FLAG; | ||||
| #  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) */ | ||||
|       if(memcmp(buf, "CPU architecture:", 17) == 0) | ||||
|       { | ||||
| @@ -134,7 +137,7 @@ opus_uint32 opus_cpu_capabilities(void) | ||||
|         version = atoi(buf+17); | ||||
| 
 | ||||
|         if(version >= 6) | ||||
|           flags |= OPUS_CPU_ARM_MEDIA; | ||||
|           flags |= OPUS_CPU_ARM_MEDIA_FLAG; | ||||
|       } | ||||
| # endif | ||||
|     } | ||||
| @@ -156,18 +159,26 @@ int opus_select_arch(void) | ||||
|   opus_uint32 flags = opus_cpu_capabilities(); | ||||
|   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; | ||||
|   } | ||||
|   arch++; | ||||
| 
 | ||||
|   if(!(flags & OPUS_CPU_ARM_MEDIA)) | ||||
|   if(!(flags & OPUS_CPU_ARM_MEDIA_FLAG)) { | ||||
|     celt_assert(arch == OPUS_ARCH_ARM_EDSP); | ||||
|     return arch; | ||||
|   } | ||||
|   arch++; | ||||
| 
 | ||||
|   if(!(flags & OPUS_CPU_ARM_NEON)) | ||||
|   if(!(flags & OPUS_CPU_ARM_NEON_FLAG)) { | ||||
|     celt_assert(arch == OPUS_ARCH_ARM_MEDIA); | ||||
|     return arch; | ||||
|   } | ||||
|   arch++; | ||||
| 
 | ||||
|   celt_assert(arch == OPUS_ARCH_ARM_NEON); | ||||
|   return arch; | ||||
| } | ||||
| 
 | ||||
| @@ -66,6 +66,12 @@ | ||||
| 
 | ||||
| # if defined(OPUS_HAVE_RTCD) | ||||
| 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 | ||||
| @@ -1,7 +1,7 @@ | ||||
| /* Copyright (c) 2015 Xiph.Org Foundation
 | ||||
|    Written by Viswanath Puttagunta */ | ||||
| /**
 | ||||
|    @file celt_ne10_fft.c | ||||
|    @file celt_fft_ne10.c | ||||
|    @brief ARM Neon optimizations for fft using NE10 library | ||||
|  */ | ||||
| 
 | ||||
| @@ -36,7 +36,6 @@ | ||||
| #endif | ||||
| #endif | ||||
| 
 | ||||
| #include <NE10_init.h> | ||||
| #include <NE10_dsp.h> | ||||
| #include "os_support.h" | ||||
| #include "kiss_fft.h" | ||||
| @@ -1,7 +1,7 @@ | ||||
| /* Copyright (c) 2015 Xiph.Org Foundation
 | ||||
|    Written by Viswanath Puttagunta */ | ||||
| /**
 | ||||
|    @file celt_ne10_mdct.c | ||||
|    @file celt_mdct_ne10.c | ||||
|    @brief ARM Neon optimizations for mdct using NE10 library | ||||
|  */ | ||||
| 
 | ||||
| @@ -37,7 +37,66 @@ | ||||
| #include <arm_neon.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 | ||||
|  * --------------------------------- | ||||
| @@ -132,121 +191,21 @@ static void xcorr_kernel_neon_float(const float32_t *x, const float32_t *y, | ||||
|    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, | ||||
|                         opus_val32 *xcorr, int len, int max_pitch) { | ||||
|                         opus_val32 *xcorr, int len, int max_pitch, int arch) { | ||||
|    int i; | ||||
|    (void)arch; | ||||
|    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) { | ||||
|       xcorr_kernel_neon_float((const float32_t *)_x, (const float32_t *)_y+i, | ||||
|             (float32_t *)xcorr+i, len); | ||||
|    } | ||||
| 
 | ||||
|    /* In case max_pitch isn't multiple of 4
 | ||||
|     * compute single correlation value per iteration | ||||
|     */ | ||||
|    /* In case max_pitch isn't a multiple of 4, do non-unrolled version. */ | ||||
|    for (; i < max_pitch; i++) { | ||||
|       xcorr_kernel_neon_float_process1((const float32_t *)_x, | ||||
|             (const float32_t *)_y+i, (float32_t *)xcorr+i, len); | ||||
|       xcorr[i] = celt_inner_prod_neon(_x, _y+i, len); | ||||
|    } | ||||
| } | ||||
| #endif | ||||
| @@ -44,7 +44,7 @@ | ||||
|  .if OPUS_ARM_MAY_HAVE_NEON
 | ||||
| 
 | ||||
| @ 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: | ||||
|   @ input:
 | ||||
|   @   r3     = int         len
 | ||||
| @@ -156,8 +156,8 @@ xcorr_kernel_neon_process1: | ||||
| 	.size xcorr_kernel_neon, .-xcorr_kernel_neon  @ ENDP
 | ||||
| 
 | ||||
| @ opus_val32 celt_pitch_xcorr_neon(opus_val16 *_x, opus_val16 *_y,
 | ||||
| @  opus_val32 *xcorr, int len, int max_pitch)
 | ||||
| ; celt_pitch_xcorr_neon: @ PROC
 | ||||
| @  opus_val32 *xcorr, int len, int max_pitch, int arch)
 | ||||
| 	.type	celt_pitch_xcorr_neon, %function; celt_pitch_xcorr_neon: @ PROC
 | ||||
|   @ input:
 | ||||
|   @   r0  = opus_val16 *_x
 | ||||
|   @   r1  = opus_val16 *_y
 | ||||
| @@ -171,6 +171,8 @@ xcorr_kernel_neon_process1: | ||||
|   @   r6  = int         max_pitch
 | ||||
|   @   r12 = int         j
 | ||||
|   @   q15 = int         maxcorr[4] (q15 is not used by xcorr_kernel_neon())
 | ||||
|   @ ignored:
 | ||||
|   @         int         arch
 | ||||
|   STMFD        sp!, {r4-r6, lr} | ||||
|   LDR          r6, [sp, #16] | ||||
|   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
 | ||||
| @ 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: | ||||
|   @ input:
 | ||||
|   @   r3      = int         len
 | ||||
| @@ -344,7 +346,7 @@ xcorr_kernel_edsp_done: | ||||
|   LDMFD        sp!, {r2,r4,r5,pc} | ||||
| 	.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:
 | ||||
|   @   r0  = opus_val16 *_x (must be 32-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
 | ||||
|   @   r1  = int         max_pitch
 | ||||
|   @   r12 = int         j
 | ||||
|   @ ignored:
 | ||||
|   @         int         arch
 | ||||
|   STMFD        sp!, {r4-r11, lr} | ||||
|   MOV          r5, r1 | ||||
|   LDR          r1, [sp, #36] | ||||
| @@ -153,7 +153,7 @@ xcorr_kernel_neon_process1 | ||||
|   ENDP | ||||
| 
 | ||||
| ; 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 | ||||
|   ; input:
 | ||||
|   ;   r0  = opus_val16 *_x
 | ||||
| @@ -168,6 +168,8 @@ celt_pitch_xcorr_neon PROC | ||||
|   ;   r6  = int         max_pitch
 | ||||
|   ;   r12 = int         j
 | ||||
|   ;   q15 = int         maxcorr[4] (q15 is not used by xcorr_kernel_neon())
 | ||||
|   ; ignored:
 | ||||
|   ;         int         arch
 | ||||
|   STMFD        sp!, {r4-r6, lr} | ||||
|   LDR          r6, [sp, #16] | ||||
|   VMOV.S32     q15, #1 | ||||
| @@ -358,6 +360,8 @@ celt_pitch_xcorr_edsp PROC | ||||
|   ;   r9  = opus_val32  sum3
 | ||||
|   ;   r1  = int         max_pitch
 | ||||
|   ;   r12 = int         j
 | ||||
|   ; ignored:
 | ||||
|   ;         int         arch
 | ||||
|   STMFD        sp!, {r4-r11, lr} | ||||
|   MOV          r5, r1 | ||||
|   LDR          r1, [sp, #36] | ||||
| @@ -34,7 +34,6 @@ | ||||
| #if !defined(FFT_ARM_H) | ||||
| #define FFT_ARM_H | ||||
| 
 | ||||
| #include "config.h" | ||||
| #include "kiss_fft.h" | ||||
| 
 | ||||
| #if defined(HAVE_ARM_NE10) | ||||
| @@ -1,5 +1,4 @@ | ||||
| /* Copyright (c) 2008-2011 Octasic Inc.
 | ||||
|    Written by Jean-Marc Valin */ | ||||
| /* Copyright (C) 2015 Vidyo */ | ||||
| /*
 | ||||
|    Redistribution and use in source and binary forms, with or without | ||||
|    modification, are permitted provided that the following conditions | ||||
| @@ -15,8 +14,8 @@ | ||||
|    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 FOUNDATION OR | ||||
|    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | ||||
|    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 | ||||
| @@ -25,19 +24,12 @@ | ||||
|    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
| */ | ||||
| 
 | ||||
| #ifndef _MLP_H_ | ||||
| #define _MLP_H_ | ||||
| #ifndef FIXED_ARM64_H | ||||
| #define FIXED_ARM64_H | ||||
| 
 | ||||
| #include "arch.h" | ||||
| #include <arm_neon.h> | ||||
| 
 | ||||
| typedef struct { | ||||
|     int layers; | ||||
|     const int *topo; | ||||
|     const float *weights; | ||||
| } MLP; | ||||
| #undef SIG2WORD16 | ||||
| #define SIG2WORD16(x) (vqmovns_s32(PSHR32((x), SIG_SHIFT))) | ||||
| 
 | ||||
| extern const MLP net; | ||||
| 
 | ||||
| void mlp_process(const MLP *m, const float *in, float *out); | ||||
| 
 | ||||
| #endif /* _MLP_H_ */ | ||||
| #endif | ||||
| @@ -37,7 +37,7 @@ static OPUS_INLINE opus_val32 MULT16_32_Q16_armv4(opus_val16 a, opus_val32 b) | ||||
|       "#MULT16_32_Q16\n\t" | ||||
|       "smull %0, %1, %2, %3\n\t" | ||||
|       : "=&r"(rd_lo), "=&r"(rd_hi) | ||||
|       : "%r"(b),"r"(a<<16) | ||||
|       : "%r"(b),"r"(SHL32(a,16)) | ||||
|   ); | ||||
|   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" | ||||
|       "smull %0, %1, %2, %3\n\t" | ||||
|       : "=&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.*/ | ||||
|   return rd_hi<<1; | ||||
|   return SHL32(rd_hi,1); | ||||
| } | ||||
| #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"(b), "r"(a) | ||||
|   ); | ||||
|   return res<<1; | ||||
|   return SHL32(res,1); | ||||
| } | ||||
| #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" | ||||
|       "smlawb %0, %1, %2, %3;\n" | ||||
|       : "=r"(res) | ||||
|       : "r"(b<<1), "r"(a), "r"(c) | ||||
|       : "r"(SHL32(b,1)), "r"(a), "r"(c) | ||||
|   ); | ||||
|   return res; | ||||
| } | ||||
| @@ -33,7 +33,6 @@ | ||||
| #if !defined(MDCT_ARM_H) | ||||
| #define MDCT_ARM_H | ||||
| 
 | ||||
| #include "config.h" | ||||
| #include "mdct.h" | ||||
| 
 | ||||
| #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
 | ||||
|    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_int16 x2; | ||||
|    tmp = (4096+((opus_int32)(x)*(x)))>>13; | ||||
|    celt_assert(tmp<=32767); | ||||
|    celt_sig_assert(tmp<=32767); | ||||
|    x2 = tmp; | ||||
|    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; | ||||
| } | ||||
| 
 | ||||
| static int bitexact_log2tan(int isin,int icos) | ||||
| int bitexact_log2tan(int isin,int icos) | ||||
| { | ||||
|    int lc; | ||||
|    int ls; | ||||
| @@ -92,10 +92,11 @@ static int bitexact_log2tan(int isin,int icos) | ||||
| 
 | ||||
| #ifdef FIXED_POINT | ||||
| /* 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; | ||||
|    const opus_int16 *eBands = m->eBands; | ||||
|    (void)arch; | ||||
|    N = m->shortMdctSize<<LM; | ||||
|    c=0; do { | ||||
|       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 */ | ||||
| /* 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; | ||||
|    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++) | ||||
|       { | ||||
|          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); | ||||
|          /*printf ("%f ", bandE[i+c*m->nbEBands]);*/ | ||||
|       } | ||||
| @@ -224,9 +225,9 @@ void denormalise_bands(const CELTMode *m, const celt_norm * OPUS_RESTRICT X, | ||||
| #endif | ||||
|       j=M*eBands[i]; | ||||
|       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 | ||||
|       g = celt_exp2(lg); | ||||
|       g = celt_exp2(MIN32(32.f, lg)); | ||||
| #else | ||||
|       /* Handle the integer part of the log energy */ | ||||
|       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. */ | ||||
|       if (shift<0) | ||||
|       { | ||||
|          /* For shift < -2 we'd be likely to overflow, so we're capping
 | ||||
|                the gain here. This shouldn't happen unless the bitstream is | ||||
|                already corrupted. */ | ||||
|          if (shift < -2) | ||||
|          /* For shift <= -2 and g > 16384 we'd be likely to overflow, so we're
 | ||||
|             capping the gain here, which is equivalent to a cap of 18 on lg. | ||||
|             This shouldn't trigger unless the bitstream is already corrupted. */ | ||||
|          if (shift <= -2) | ||||
|          { | ||||
|             g = 32767; | ||||
|             g = 16384; | ||||
|             shift = -2; | ||||
|          } | ||||
|          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]; | ||||
|       /* 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; | ||||
| 
 | ||||
| #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) | ||||
| { | ||||
|    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 */ | ||||
|    xp = MULT16_32_Q15(mid, xp); | ||||
|    /* 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; | ||||
|    Er = MULT16_16(mid2, mid2) + side + 2*xp; | ||||
|    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 */ | ||||
| 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 end, int C, int M) | ||||
|       int end, int C, int M, const int *spread_weight) | ||||
| { | ||||
|    int i, c, N0; | ||||
|    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) | ||||
|             hf_sum += celt_udiv(32*(tcount[1]+tcount[0]), N); | ||||
|          tmp = (2*tcount[2] >= N) + (2*tcount[1] >= N) + (2*tcount[0] >= N); | ||||
|          sum += tmp*256; | ||||
|          nbBands++; | ||||
|          sum += tmp*spread_weight[i]; | ||||
|          nbBands+=spread_weight[i]; | ||||
|       } | ||||
|    } 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);*/ | ||||
|    celt_assert(nbBands>0); /* end has to be non-zero */ | ||||
|    celt_assert(sum>=0); | ||||
|    sum = celt_udiv(sum, nbBands); | ||||
|    sum = celt_udiv((opus_int32)sum<<8, nbBands); | ||||
|    /* Recursive averaging */ | ||||
|    sum = (sum+*average)>>1; | ||||
|    *average = sum; | ||||
| @@ -647,6 +672,7 @@ static int compute_qn(int N, int b, int offset, int pulse_cap, int stereo) | ||||
| 
 | ||||
| struct band_ctx { | ||||
|    int encode; | ||||
|    int resynth; | ||||
|    const CELTMode *m; | ||||
|    int i; | ||||
|    int intensity; | ||||
| @@ -657,6 +683,9 @@ struct band_ctx { | ||||
|    const celt_ener *bandE; | ||||
|    opus_uint32 seed; | ||||
|    int arch; | ||||
|    int theta_round; | ||||
|    int disable_inv; | ||||
|    int avoid_split_noise; | ||||
| }; | ||||
| 
 | ||||
| struct split_ctx { | ||||
| @@ -714,8 +743,35 @@ static void compute_theta(struct band_ctx *ctx, struct split_ctx *sctx, | ||||
|    if (qn!=1) | ||||
|    { | ||||
|       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
 | ||||
|          time split, a step for stereo, and a triangular one for the rest. */ | ||||
|       if (stereo && N>2) | ||||
| @@ -793,7 +849,7 @@ static void compute_theta(struct band_ctx *ctx, struct split_ctx *sctx, | ||||
|    } else if (stereo) { | ||||
|       if (encode) | ||||
|       { | ||||
|          inv = itheta > 8192; | ||||
|          inv = itheta > 8192 && !ctx->disable_inv; | ||||
|          if (inv) | ||||
|          { | ||||
|             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); | ||||
|       } else | ||||
|          inv = 0; | ||||
|       /* inv flag override to avoid problems with downmixing. */ | ||||
|       if (ctx->disable_inv) | ||||
|          inv = 0; | ||||
|       itheta = 0; | ||||
|    } | ||||
|    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, | ||||
|       celt_norm *lowband_out) | ||||
| { | ||||
| #ifdef RESYNTH | ||||
|    int resynth = 1; | ||||
| #else | ||||
|    int resynth = !ctx->encode; | ||||
| #endif | ||||
|    int c; | ||||
|    int stereo; | ||||
|    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; | ||||
|          b-=1<<BITRES; | ||||
|       } | ||||
|       if (resynth) | ||||
|       if (ctx->resynth) | ||||
|          x[0] = sign ? -NORM_SCALING : NORM_SCALING; | ||||
|       x = Y; | ||||
|    } while (++c<1+stereo); | ||||
| @@ -899,11 +953,6 @@ static unsigned quant_partition(struct band_ctx *ctx, celt_norm *X, | ||||
|    int B0=B; | ||||
|    opus_val16 mid=0, side=0; | ||||
|    unsigned cm=0; | ||||
| #ifdef RESYNTH | ||||
|    int resynth = 1; | ||||
| #else | ||||
|    int resynth = !ctx->encode; | ||||
| #endif | ||||
|    celt_norm *Y=NULL; | ||||
|    int encode; | ||||
|    const CELTMode *m; | ||||
| @@ -935,8 +984,7 @@ static unsigned quant_partition(struct band_ctx *ctx, celt_norm *X, | ||||
|          fill = (fill&1)|(fill<<1); | ||||
|       B = (B+1)>>1; | ||||
| 
 | ||||
|       compute_theta(ctx, &sctx, X, Y, N, &b, B, B0, | ||||
|             LM, 0, &fill); | ||||
|       compute_theta(ctx, &sctx, X, Y, N, &b, B, B0, LM, 0, &fill); | ||||
|       imid = sctx.imid; | ||||
|       iside = sctx.iside; | ||||
|       delta = sctx.delta; | ||||
| @@ -970,24 +1018,20 @@ static unsigned quant_partition(struct band_ctx *ctx, celt_norm *X, | ||||
|       rebalance = ctx->remaining_bits; | ||||
|       if (mbits >= sbits) | ||||
|       { | ||||
|          cm = quant_partition(ctx, X, N, mbits, B, | ||||
|                lowband, LM, | ||||
|          cm = quant_partition(ctx, X, N, mbits, B, lowband, LM, | ||||
|                MULT16_16_P15(gain,mid), fill); | ||||
|          rebalance = mbits - (rebalance-ctx->remaining_bits); | ||||
|          if (rebalance > 3<<BITRES && itheta!=0) | ||||
|             sbits += rebalance - (3<<BITRES); | ||||
|          cm |= quant_partition(ctx, Y, N, sbits, B, | ||||
|                next_lowband2, LM, | ||||
|          cm |= quant_partition(ctx, Y, N, sbits, B, next_lowband2, LM, | ||||
|                MULT16_16_P15(gain,side), fill>>B)<<(B0>>1); | ||||
|       } else { | ||||
|          cm = quant_partition(ctx, Y, N, sbits, B, | ||||
|                next_lowband2, LM, | ||||
|          cm = quant_partition(ctx, Y, N, sbits, B, next_lowband2, LM, | ||||
|                MULT16_16_P15(gain,side), fill>>B)<<(B0>>1); | ||||
|          rebalance = sbits - (rebalance-ctx->remaining_bits); | ||||
|          if (rebalance > 3<<BITRES && itheta!=16384) | ||||
|             mbits += rebalance - (3<<BITRES); | ||||
|          cm |= quant_partition(ctx, X, N, mbits, B, | ||||
|                lowband, LM, | ||||
|          cm |= quant_partition(ctx, X, N, mbits, B, lowband, LM, | ||||
|                MULT16_16_P15(gain,mid), fill); | ||||
|       } | ||||
|    } else { | ||||
| @@ -1012,18 +1056,14 @@ static unsigned quant_partition(struct band_ctx *ctx, celt_norm *X, | ||||
|          /* Finally do the actual quantization */ | ||||
|          if (encode) | ||||
|          { | ||||
|             cm = alg_quant(X, N, K, spread, B, ec | ||||
| #ifdef RESYNTH | ||||
|                  , gain | ||||
| #endif | ||||
|                  ); | ||||
|             cm = alg_quant(X, N, K, spread, B, ec, gain, ctx->resynth, ctx->arch); | ||||
|          } else { | ||||
|             cm = alg_unquant(X, N, K, spread, B, ec, gain); | ||||
|          } | ||||
|       } else { | ||||
|          /* If there's no pulse, fill the band anyway */ | ||||
|          int j; | ||||
|          if (resynth) | ||||
|          if (ctx->resynth) | ||||
|          { | ||||
|             unsigned cm_mask; | ||||
|             /* 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 longBlocks; | ||||
|    unsigned cm=0; | ||||
| #ifdef RESYNTH | ||||
|    int resynth = 1; | ||||
| #else | ||||
|    int resynth = !ctx->encode; | ||||
| #endif | ||||
|    int k; | ||||
|    int encode; | ||||
|    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); | ||||
|    } | ||||
| 
 | ||||
|    cm = quant_partition(ctx, X, N, b, B, lowband, | ||||
|          LM, gain, fill); | ||||
|    cm = quant_partition(ctx, X, N, b, B, lowband, LM, gain, fill); | ||||
| 
 | ||||
|    /* 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 */ | ||||
|       if (B0>1) | ||||
| @@ -1208,11 +1242,6 @@ static unsigned quant_band_stereo(struct band_ctx *ctx, celt_norm *X, celt_norm | ||||
|    int inv = 0; | ||||
|    opus_val16 mid=0, side=0; | ||||
|    unsigned cm=0; | ||||
| #ifdef RESYNTH | ||||
|    int resynth = 1; | ||||
| #else | ||||
|    int resynth = !ctx->encode; | ||||
| #endif | ||||
|    int mbits, sbits, delta; | ||||
|    int itheta; | ||||
|    int qalloc; | ||||
| @@ -1232,8 +1261,7 @@ static unsigned quant_band_stereo(struct band_ctx *ctx, celt_norm *X, celt_norm | ||||
| 
 | ||||
|    orig_fill = fill; | ||||
| 
 | ||||
|    compute_theta(ctx, &sctx, X, Y, N, &b, B, B, | ||||
|          LM, 1, &fill); | ||||
|    compute_theta(ctx, &sctx, X, Y, N, &b, B, B, LM, 1, &fill); | ||||
|    inv = sctx.inv; | ||||
|    imid = sctx.imid; | ||||
|    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; | ||||
|       /* 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. */ | ||||
|       cm = quant_band(ctx, x2, N, mbits, B, lowband, | ||||
|             LM, lowband_out, Q15ONE, lowband_scratch, orig_fill); | ||||
|       cm = quant_band(ctx, x2, N, mbits, B, lowband, LM, lowband_out, Q15ONE, | ||||
|             lowband_scratch, orig_fill); | ||||
|       /* 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. */ | ||||
|       y2[0] = -sign*x2[1]; | ||||
|       y2[1] = sign*x2[0]; | ||||
|       if (resynth) | ||||
|       if (ctx->resynth) | ||||
|       { | ||||
|          celt_norm tmp; | ||||
|          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
 | ||||
|             mid for folding later. */ | ||||
|          cm = quant_band(ctx, X, N, mbits, B, | ||||
|                lowband, LM, lowband_out, | ||||
|                Q15ONE, lowband_scratch, fill); | ||||
|          cm = quant_band(ctx, X, N, mbits, B, lowband, LM, lowband_out, Q15ONE, | ||||
|                lowband_scratch, fill); | ||||
|          rebalance = mbits - (rebalance-ctx->remaining_bits); | ||||
|          if (rebalance > 3<<BITRES && itheta!=0) | ||||
|             sbits += rebalance - (3<<BITRES); | ||||
| 
 | ||||
|          /* For a stereo split, the high bits of fill are always zero, so no
 | ||||
|             folding will be done to the side. */ | ||||
|          cm |= quant_band(ctx, Y, N, sbits, B, | ||||
|                NULL, LM, NULL, | ||||
|                side, NULL, fill>>B); | ||||
|          cm |= quant_band(ctx, Y, N, sbits, B, NULL, LM, NULL, side, NULL, fill>>B); | ||||
|       } else { | ||||
|          /* For a stereo split, the high bits of fill are always zero, so no
 | ||||
|             folding will be done to the side. */ | ||||
|          cm = quant_band(ctx, Y, N, sbits, B, | ||||
|                NULL, LM, NULL, | ||||
|                side, NULL, fill>>B); | ||||
|          cm = quant_band(ctx, Y, N, sbits, B, NULL, LM, NULL, side, NULL, fill>>B); | ||||
|          rebalance = sbits - (rebalance-ctx->remaining_bits); | ||||
|          if (rebalance > 3<<BITRES && itheta!=16384) | ||||
|             mbits += rebalance - (3<<BITRES); | ||||
|          /* In stereo mode, we do not apply a scaling to the mid because we need the normalized
 | ||||
|             mid for folding later. */ | ||||
|          cm |= quant_band(ctx, X, N, mbits, B, | ||||
|                lowband, LM, lowband_out, | ||||
|                Q15ONE, lowband_scratch, fill); | ||||
|          cm |= quant_band(ctx, X, N, mbits, B, lowband, LM, lowband_out, Q15ONE, | ||||
|                lowband_scratch, fill); | ||||
|       } | ||||
|    } | ||||
| 
 | ||||
| 
 | ||||
|    /* This code is used by the decoder and by the resynthesis-enabled encoder */ | ||||
|    if (resynth) | ||||
|    if (ctx->resynth) | ||||
|    { | ||||
|       if (N!=2) | ||||
|          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; | ||||
| } | ||||
| 
 | ||||
| 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, | ||||
|       celt_norm *X_, celt_norm *Y_, unsigned char *collapse_masks, | ||||
|       const celt_ener *bandE, int *pulses, int shortBlocks, int spread, | ||||
|       int dual_stereo, int intensity, int *tf_res, opus_int32 total_bits, | ||||
|       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; | ||||
|    opus_int32 remaining_bits; | ||||
|    const opus_int16 * OPUS_RESTRICT eBands = m->eBands; | ||||
|    celt_norm * OPUS_RESTRICT norm, * OPUS_RESTRICT norm2; | ||||
|    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; | ||||
|    int B; | ||||
|    int M; | ||||
| @@ -1379,10 +1420,11 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end, | ||||
|    int update_lowband = 1; | ||||
|    int C = Y_ != NULL ? 2 : 1; | ||||
|    int norm_offset; | ||||
|    int theta_rdo = encode && Y_!=NULL && !dual_stereo && complexity>=8; | ||||
| #ifdef RESYNTH | ||||
|    int resynth = 1; | ||||
| #else | ||||
|    int resynth = !encode; | ||||
|    int resynth = !encode || theta_rdo; | ||||
| #endif | ||||
|    struct band_ctx ctx; | ||||
|    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); | ||||
|    norm = _norm; | ||||
|    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
 | ||||
|       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; | ||||
|    ctx.bandE = bandE; | ||||
| @@ -1408,6 +1465,11 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end, | ||||
|    ctx.seed = *seed; | ||||
|    ctx.spread = spread; | ||||
|    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++) | ||||
|    { | ||||
|       opus_int32 tell; | ||||
| @@ -1430,6 +1492,7 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end, | ||||
|       else | ||||
|          Y = NULL; | ||||
|       N = M*eBands[i+1]-M*eBands[i]; | ||||
|       celt_assert(N > 0); | ||||
|       tell = ec_tell_frac(ec); | ||||
| 
 | ||||
|       /* 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; | ||||
|       } | ||||
| 
 | ||||
| #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)) | ||||
|             lowband_offset = i; | ||||
| #endif | ||||
| 
 | ||||
|       tf_change = tf_res[i]; | ||||
|       ctx.tf_change = tf_change; | ||||
| @@ -1457,7 +1527,7 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end, | ||||
|             Y = norm; | ||||
|          lowband_scratch = NULL; | ||||
|       } | ||||
|       if (i==end-1) | ||||
|       if (last && !theta_rdo) | ||||
|          lowband_scratch = NULL; | ||||
| 
 | ||||
|       /* 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; | ||||
|          while(M*eBands[--fold_start] > effective_lowband+norm_offset); | ||||
|          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); | ||||
| #endif | ||||
|          x_cm = y_cm = 0; | ||||
|          fold_i = fold_start; do { | ||||
|            x_cm |= collapse_masks[fold_i*C+0]; | ||||
| @@ -1505,9 +1579,75 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end, | ||||
|       } else { | ||||
|          if (Y!=NULL) | ||||
|          { | ||||
|             if (theta_rdo && i < intensity) | ||||
|             { | ||||
|                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 { | ||||
|             x_cm = quant_band(&ctx, X, N, b, B, | ||||
|                   effective_lowband != -1 ? norm+effective_lowband : NULL, LM, | ||||
| @@ -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_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; | ||||
| 
 | ||||
| @@ -36,12 +36,15 @@ | ||||
| #include "entdec.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
 | ||||
|  * @param m Mode data | ||||
|  * @param X Spectrum | ||||
|  * @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);*/ | ||||
| 
 | ||||
| @@ -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 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 | ||||
| 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, | ||||
|       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, | ||||
|       int arch); | ||||
|       int complexity, int arch, int disable_inv); | ||||
| 
 | ||||
| void anti_collapse(const CELTMode *m, celt_norm *X_, | ||||
|       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(t, g11, ADD32(x1,x3)); | ||||
|       t = MAC16_32_Q16(t, g12, ADD32(x0,x4)); | ||||
|       t = SATURATE(t, SIG_SAT); | ||||
|       y[i] = t; | ||||
|       x4=SHL32(x[i-T+3],1); | ||||
|       t = MAC16_32_Q16(x[i+1], g10, x1); | ||||
|       t = MAC16_32_Q16(t, g11, ADD32(x0,x2)); | ||||
|       t = MAC16_32_Q16(t, g12, ADD32(x4,x3)); | ||||
|       t = SATURATE(t, SIG_SAT); | ||||
|       y[i+1] = t; | ||||
|       x3=SHL32(x[i-T+4],1); | ||||
|       t = MAC16_32_Q16(x[i+2], g10, x0); | ||||
|       t = MAC16_32_Q16(t, g11, ADD32(x4,x1)); | ||||
|       t = MAC16_32_Q16(t, g12, ADD32(x3,x2)); | ||||
|       t = SATURATE(t, SIG_SAT); | ||||
|       y[i+2] = t; | ||||
|       x2=SHL32(x[i-T+5],1); | ||||
|       t = MAC16_32_Q16(x[i+3], g10, x4); | ||||
|       t = MAC16_32_Q16(t, g11, ADD32(x3,x0)); | ||||
|       t = MAC16_32_Q16(t, g12, ADD32(x2,x1)); | ||||
|       t = SATURATE(t, SIG_SAT); | ||||
|       y[i+3] = t; | ||||
|       x1=SHL32(x[i-T+6],1); | ||||
|       t = MAC16_32_Q16(x[i+4], g10, x3); | ||||
|       t = MAC16_32_Q16(t, g11, ADD32(x2,x4)); | ||||
|       t = MAC16_32_Q16(t, g12, ADD32(x1,x0)); | ||||
|       t = SATURATE(t, SIG_SAT); | ||||
|       y[i+4] = t; | ||||
|    } | ||||
| #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(t, g11, ADD32(x1,x3)); | ||||
|       t = MAC16_32_Q16(t, g12, ADD32(x0,x4)); | ||||
|       t = SATURATE(t, SIG_SAT); | ||||
|       y[i] = t; | ||||
|       x4=x3; | ||||
|       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(g11,ADD32(x1,x3)) | ||||
|                + MULT16_32_Q15(g12,ADD32(x0,x4)); | ||||
|       y[i] = SATURATE(y[i], SIG_SAT); | ||||
|       x4=x3; | ||||
|       x3=x2; | ||||
|       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); | ||||
|       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]); | ||||
|    g01 = MULT16_16_P15(g0, gains[tapset0][1]); | ||||
|    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,g11),ADD32(x1,x3)) | ||||
|                + MULT16_32_Q15(MULT16_16_Q15(f,g12),ADD32(x0,x4)); | ||||
|       y[i] = SATURATE(y[i], SIG_SAT); | ||||
|       x4=x3; | ||||
|       x3=x2; | ||||
|       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 */ | ||||
| 
 | ||||
| /* 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] = { | ||||
|       {0, -1, 0, -1,    0,-1, 0,-1}, | ||||
|       {0, -1, 0, -2,    1, 0, 1,-1}, | ||||
|       {0, -2, 0, -3,    2, 0, 1,-1}, | ||||
|       {0, -2, 0, -3,    3, 0, 1,-1}, | ||||
|     /*isTransient=0     isTransient=1 */ | ||||
|       {0, -1, 0, -1,    0,-1, 0,-1}, /* 2.5 ms */ | ||||
|       {0, -1, 0, -2,    1, 0, 1,-1}, /* 5 ms */ | ||||
|       {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 CELTMode OpusCustomMode | ||||
| 
 | ||||
| #define LEAK_BANDS 19 | ||||
| 
 | ||||
| typedef struct { | ||||
|    int valid; | ||||
|    float tonality; | ||||
| @@ -57,17 +59,27 @@ typedef struct { | ||||
|    float noisiness; | ||||
|    float activity; | ||||
|    float music_prob; | ||||
|    float music_prob_min; | ||||
|    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_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 */ | ||||
| #define OPUS_FRAMESIZE_VARIABLE              5010 /**< Optimize the frame size dynamically */ | ||||
| /* Encoder/decoder Requests */ | ||||
| 
 | ||||
| 
 | ||||
| #define CELT_SET_PREDICTION_REQUEST    10002 | ||||
| @@ -116,6 +128,9 @@ typedef struct { | ||||
| #define OPUS_SET_ENERGY_MASK_REQUEST    10026 | ||||
| #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 */ | ||||
| 
 | ||||
| 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]; | ||||
| 
 | ||||
| #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); | ||||
| 
 | ||||
| void celt_preemphasis(const opus_val16 * OPUS_RESTRICT pcmp, celt_sig * OPUS_RESTRICT inp, | ||||
| @@ -51,6 +51,14 @@ | ||||
| #include "celt_lpc.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) | ||||
| #define NORM_ALIASING_HACK | ||||
| #endif | ||||
| @@ -73,6 +81,7 @@ struct OpusCustomDecoder { | ||||
|    int downsample; | ||||
|    int start, end; | ||||
|    int signalling; | ||||
|    int disable_inv; | ||||
|    int arch; | ||||
| 
 | ||||
|    /* Everything beyond this point gets cleared on a reset */ | ||||
| @@ -82,6 +91,7 @@ struct OpusCustomDecoder { | ||||
|    int error; | ||||
|    int last_pitch_index; | ||||
|    int loss_count; | ||||
|    int skip_plc; | ||||
|    int postfilter_period; | ||||
|    int postfilter_period_old; | ||||
|    opus_val16 postfilter_gain; | ||||
| @@ -99,6 +109,38 @@ struct OpusCustomDecoder { | ||||
|    /* 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) | ||||
| { | ||||
|    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->end = st->mode->effEBands; | ||||
|    st->signalling = 1; | ||||
| #ifndef DISABLE_UPDATE_DRAFT | ||||
|    st->disable_inv = channels == 1; | ||||
| #else | ||||
|    st->disable_inv = 0; | ||||
| #endif | ||||
|    st->arch = opus_select_arch(); | ||||
| 
 | ||||
|    st->loss_count = 0; | ||||
| 
 | ||||
|    opus_custom_decoder_ctl(st, OPUS_RESET_STATE); | ||||
| 
 | ||||
|    return OPUS_OK; | ||||
| @@ -178,6 +223,36 @@ void opus_custom_decoder_destroy(CELTDecoder *st) | ||||
| } | ||||
| #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 | ||||
| static | ||||
| @@ -191,6 +266,14 @@ void deemphasis(celt_sig *in[], opus_val16 *pcm, int N, int C, int downsample, c | ||||
|    opus_val16 coef0; | ||||
|    VARDECL(celt_sig, scratch); | ||||
|    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 | ||||
|    (void)accum; | ||||
|    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 */ | ||||
|          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); | ||||
|             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++) | ||||
|             { | ||||
|                celt_sig tmp = x[j] + m + VERY_SMALL; | ||||
|                celt_sig tmp = x[j] + VERY_SMALL + m; | ||||
|                m = MULT16_32_Q15(coef0, 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, | ||||
|             downsample, silence); | ||||
|       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++) | ||||
|          clt_mdct_backward(&mode->mdct, &freq[b], out_syn[0]+NB*b, mode->window, overlap, shift, B, arch); | ||||
|    } 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); | ||||
|       } 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; | ||||
| } | ||||
| 
 | ||||
| @@ -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) | ||||
| { | ||||
|    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; | ||||
|    start = st->start; | ||||
|    noise_based = loss_count >= 5 || start != 0; | ||||
|    noise_based = loss_count >= 5 || start != 0 || st->skip_plc; | ||||
|    if (noise_based) | ||||
|    { | ||||
|       /* 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); | ||||
|    } else { | ||||
|       int exc_length; | ||||
|       /* Pitch-based PLC */ | ||||
|       const opus_val16 *window; | ||||
|       opus_val16 *exc; | ||||
|       opus_val16 fade = Q15ONE; | ||||
|       int pitch_index; | ||||
|       VARDECL(opus_val32, etmp); | ||||
|       VARDECL(opus_val16, exc); | ||||
|       VARDECL(opus_val16, _exc); | ||||
|       VARDECL(opus_val16, fir_tmp); | ||||
| 
 | ||||
|       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); | ||||
|       } | ||||
| 
 | ||||
|       /* 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(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; | ||||
|       c=0; do { | ||||
|          opus_val16 decay; | ||||
| @@ -530,13 +620,11 @@ static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM) | ||||
|          celt_sig *buf; | ||||
|          int extrapolation_offset; | ||||
|          int extrapolation_len; | ||||
|          int exc_length; | ||||
|          int j; | ||||
| 
 | ||||
|          buf = decode_mem[c]; | ||||
|          for (i=0;i<MAX_PERIOD;i++) { | ||||
|             exc[i] = ROUND16(buf[DECODE_BUFFER_SIZE-MAX_PERIOD+i], SIG_SHIFT); | ||||
|          } | ||||
|          for (i=0;i<MAX_PERIOD+LPC_ORDER;i++) | ||||
|             exc[i-LPC_ORDER] = ROUND16(buf[DECODE_BUFFER_SIZE-MAX_PERIOD-LPC_ORDER+i], SIG_SHIFT); | ||||
| 
 | ||||
|          if (loss_count == 0) | ||||
|          { | ||||
| @@ -562,22 +650,32 @@ static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM) | ||||
| #endif | ||||
|             } | ||||
|             _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
 | ||||
|             of the region for which we're computing the excitation. */ | ||||
|          { | ||||
|             opus_val16 lpc_mem[LPC_ORDER]; | ||||
|             for (i=0;i<LPC_ORDER;i++) | ||||
|             { | ||||
|                lpc_mem[i] = | ||||
|                      ROUND16(buf[DECODE_BUFFER_SIZE-exc_length-1-i], SIG_SHIFT); | ||||
|             } | ||||
|             /* Compute the excitation for exc_length samples before the loss. */ | ||||
|             /* Compute the excitation for exc_length samples before the loss. We need the copy
 | ||||
|                because celt_fir() cannot filter in-place. */ | ||||
|             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.
 | ||||
| @@ -631,9 +729,8 @@ static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM) | ||||
|             tmp = ROUND16( | ||||
|                   buf[DECODE_BUFFER_SIZE-MAX_PERIOD-N+extrapolation_offset+j], | ||||
|                   SIG_SHIFT); | ||||
|             S1 += SHR32(MULT16_16(tmp, tmp), 8); | ||||
|             S1 += SHR32(MULT16_16(tmp, tmp), 10); | ||||
|          } | ||||
| 
 | ||||
|          { | ||||
|             opus_val16 lpc_mem[LPC_ORDER]; | ||||
|             /* 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, | ||||
|                   buf+DECODE_BUFFER_SIZE-N, extrapolation_len, LPC_ORDER, | ||||
|                   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
 | ||||
| @@ -655,7 +756,7 @@ static void celt_decode_lost(CELTDecoder * OPUS_RESTRICT st, int N, int LM) | ||||
|             for (i=0;i<extrapolation_len;i++) | ||||
|             { | ||||
|                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. */ | ||||
| #ifdef FIXED_POINT | ||||
| @@ -763,6 +864,7 @@ int celt_decode_with_ec(CELTDecoder * OPUS_RESTRICT st, const unsigned char *dat | ||||
|    const opus_int16 *eBands; | ||||
|    ALLOC_STACK; | ||||
| 
 | ||||
|    VALIDATE_CELT_DECODER(st); | ||||
|    mode = st->mode; | ||||
|    nbEBands = mode->nbEBands; | ||||
|    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; | ||||
|    } | ||||
| 
 | ||||
|    /* 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) | ||||
|    { | ||||
|       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(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, | ||||
|          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, | ||||
|          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) | ||||
|    { | ||||
| @@ -1198,6 +1305,7 @@ int opus_custom_decoder_ctl(CELTDecoder * OPUS_RESTRICT st, int request, ...) | ||||
|                ((char*)&st->DECODER_RESET_START - (char*)st)); | ||||
|          for (i=0;i<2*st->mode->nbEBands;i++) | ||||
|             oldLogE[i]=oldLogE2[i]=-QCONST16(28.f,DB_SHIFT); | ||||
|          st->skip_plc = 1; | ||||
|       } | ||||
|       break; | ||||
|       case OPUS_GET_PITCH_REQUEST: | ||||
| @@ -1230,6 +1338,26 @@ int opus_custom_decoder_ctl(CELTDecoder * OPUS_RESTRICT st, int request, ...) | ||||
|          *value=st->rng; | ||||
|       } | ||||
|       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: | ||||
|          goto bad_request; | ||||
|    } | ||||
| @@ -73,8 +73,8 @@ struct OpusCustomEncoder { | ||||
|    int constrained_vbr;      /* If zero, VBR can do whatever it likes with the rate */ | ||||
|    int loss_rate; | ||||
|    int lsb_depth; | ||||
|    int variable_duration; | ||||
|    int lfe; | ||||
|    int disable_inv; | ||||
|    int arch; | ||||
| 
 | ||||
|    /* Everything beyond this point gets cleared on a reset */ | ||||
| @@ -98,6 +98,7 @@ struct OpusCustomEncoder { | ||||
| #endif | ||||
|    int consec_transient; | ||||
|    AnalysisInfo analysis; | ||||
|    SILKInfo silk_info; | ||||
| 
 | ||||
|    opus_val32 preemph_memE[2]; | ||||
|    opus_val32 preemph_memD[2]; | ||||
| @@ -123,6 +124,7 @@ struct OpusCustomEncoder { | ||||
|    /* opus_val16 oldBandE[],     Size = channels*mode->nbEBands */ | ||||
|    /* opus_val16 oldLogE[],      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) | ||||
| @@ -136,9 +138,10 @@ OPUS_CUSTOM_NOSTATIC int opus_custom_encoder_get_size(const CELTMode *mode, int | ||||
|    int size = sizeof(struct CELTEncoder) | ||||
|          + (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]; */ | ||||
|          + 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 oldLogE2[channels*mode->nbEBands]; */ | ||||
|                                                           /* opus_val16 energyError[channels*mode->nbEBands]; */ | ||||
|    return size; | ||||
| } | ||||
| 
 | ||||
| @@ -178,7 +181,6 @@ static int opus_custom_encoder_init_arch(CELTEncoder *st, const CELTMode *mode, | ||||
|    st->start = 0; | ||||
|    st->end = st->mode->effEBands; | ||||
|    st->signalling = 1; | ||||
| 
 | ||||
|    st->arch = arch; | ||||
| 
 | ||||
|    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, | ||||
|                               opus_val16 *tf_estimate, int *tf_chan) | ||||
|                               opus_val16 *tf_estimate, int *tf_chan, int allow_weak_transients, | ||||
|                               int *weak_transient) | ||||
| { | ||||
|    int i; | ||||
|    VARDECL(opus_val16, tmp); | ||||
| @@ -233,6 +236,12 @@ static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int | ||||
|    int c; | ||||
|    opus_val16 tf_max; | ||||
|    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 */ | ||||
|    static const unsigned char inv_table[128] = { | ||||
|          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; | ||||
|    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; | ||||
|    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; | ||||
|          mem1 = x - .5f*y; | ||||
| #endif | ||||
|          tmp[i] = EXTRACT16(SHR32(y,2)); | ||||
|          tmp[i] = SROUND16(y, 2); | ||||
|          /*printf("%f ", tmp[i]);*/ | ||||
|       } | ||||
|       /*printf("\n");*/ | ||||
| @@ -280,7 +302,7 @@ static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int | ||||
|       /* Normalize tmp to max range */ | ||||
|       { | ||||
|          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) | ||||
|          { | ||||
|             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; | ||||
| #ifdef FIXED_POINT | ||||
|          /* FIXME: Use PSHR16() instead */ | ||||
|          tmp[i] = mem0 + PSHR32(x2-mem0,4); | ||||
|          tmp[i] = mem0 + PSHR32(x2-mem0,forward_shift); | ||||
| #else | ||||
|          tmp[i] = mem0 + MULT16_16_P15(QCONST16(.0625f,15),x2-mem0); | ||||
|          tmp[i] = mem0 + MULT16_16_P15(forward_decay,x2-mem0); | ||||
| #endif | ||||
|          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 */ | ||||
|       for (i=len2-1;i>=0;i--) | ||||
|       { | ||||
|          /* Backward masking: 13.9 dB/ms. */ | ||||
| #ifdef FIXED_POINT | ||||
|          /* FIXME: Use PSHR16() instead */ | ||||
|          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
 | ||||
|          The data is smooth, so we only take 1/4th of the samples */ | ||||
|       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) | ||||
|       { | ||||
|          int id; | ||||
| @@ -359,7 +388,12 @@ static int transient_analysis(const opus_val32 * OPUS_RESTRICT in, int len, int | ||||
|       } | ||||
|    } | ||||
|    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 */ | ||||
|    tf_max = MAX16(0,celt_sqrt(27*mask_metric)-42); | ||||
|    /* *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, | ||||
|       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; | ||||
|    VARDECL(int, metric); | ||||
| @@ -574,7 +608,6 @@ static int tf_analysis(const CELTMode *m, int len, int isTransient, | ||||
|    ALLOC(path0, len, int); | ||||
|    ALLOC(path1, len, int); | ||||
| 
 | ||||
|    *tf_sum = 0; | ||||
|    for (i=0;i<len;i++) | ||||
|    { | ||||
|       int k, N; | ||||
| @@ -629,27 +662,26 @@ static int tf_analysis(const CELTMode *m, int len, int isTransient, | ||||
|          metric[i] = 2*best_level; | ||||
|       else | ||||
|          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
 | ||||
|          biasing the decision */ | ||||
|       if (narrow && (metric[i]==0 || metric[i]==-2*LM)) | ||||
|          metric[i]-=1; | ||||
|       /*printf("%d ", metric[i]);*/ | ||||
|       /*printf("%d ", metric[i]/2 + (!isTransient)*LM);*/ | ||||
|    } | ||||
|    /*printf("\n");*/ | ||||
|    /* Search for the optimal tf resolution, including tf_select */ | ||||
|    tf_select = 0; | ||||
|    for (sel=0;sel<2;sel++) | ||||
|    { | ||||
|       cost0 = 0; | ||||
|       cost1 = isTransient ? 0 : lambda; | ||||
|       cost0 = importance[0]*abs(metric[0]-2*tf_select_table[LM][4*isTransient+2*sel+0]); | ||||
|       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++) | ||||
|       { | ||||
|          int curr0, curr1; | ||||
|          curr0 = IMIN(cost0, cost1 + lambda); | ||||
|          curr1 = IMIN(cost0 + lambda, cost1); | ||||
|          cost0 = curr0 + 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]); | ||||
|          cost0 = curr0 + importance[i]*abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*sel+0]); | ||||
|          cost1 = curr1 + importance[i]*abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*sel+1]); | ||||
|       } | ||||
|       cost0 = IMIN(cost0, cost1); | ||||
|       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 (selcost[1]<selcost[0] && isTransient) | ||||
|       tf_select=1; | ||||
|    cost0 = 0; | ||||
|    cost1 = isTransient ? 0 : lambda; | ||||
|    cost0 = importance[0]*abs(metric[0]-2*tf_select_table[LM][4*isTransient+2*tf_select+0]); | ||||
|    cost1 = importance[0]*abs(metric[0]-2*tf_select_table[LM][4*isTransient+2*tf_select+1]) + (isTransient ? 0 : lambda); | ||||
|    /* Viterbi forward pass */ | ||||
|    for (i=1;i<len;i++) | ||||
|    { | ||||
| @@ -687,8 +719,8 @@ static int tf_analysis(const CELTMode *m, int len, int isTransient, | ||||
|          curr1 = from1; | ||||
|          path1[i]= 1; | ||||
|       } | ||||
|       cost0 = curr0 + 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]); | ||||
|       cost0 = curr0 + importance[i]*abs(metric[i]-2*tf_select_table[LM][4*isTransient+2*tf_select+0]); | ||||
|       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; | ||||
|    /* 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, | ||||
|       const opus_val16 *bandLogE, int end, int LM, int C, int N0, | ||||
|       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; | ||||
|    opus_val32 diff=0; | ||||
| @@ -762,6 +794,14 @@ static int alloc_trim_analysis(const CELTMode *m, const celt_norm *X, | ||||
|    int trim_index; | ||||
|    opus_val16 trim = QCONST16(5.f, 8); | ||||
|    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) | ||||
|    { | ||||
|       opus_val16 sum = 0; /* Q10 */ | ||||
| @@ -809,7 +849,7 @@ static int alloc_trim_analysis(const CELTMode *m, const celt_norm *X, | ||||
|    } while (++c<C); | ||||
|    diff /= C*(end-1); | ||||
|    /*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 -= 2*SHR16(tf_estimate, 14-8); | ||||
| #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, | ||||
|       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 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; | ||||
|    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++) | ||||
|          maxDepth = MAX16(maxDepth, bandLogE[c*nbEBands+i]-noise_floor[i]); | ||||
|    } 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 */ | ||||
|    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++) | ||||
|          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 */ | ||||
|       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++) | ||||
|       { | ||||
|          int width; | ||||
|          int boost; | ||||
|          int boost_bits; | ||||
| 
 | ||||
|          if (i<8) | ||||
|             follower[i] *= 2; | ||||
|          if (i>=12) | ||||
|             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)); | ||||
| 
 | ||||
|          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_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)) | ||||
|                && (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; | ||||
|             tot_boost = cap; | ||||
|             break; | ||||
| @@ -1055,6 +1152,9 @@ static opus_val16 dynalloc_analysis(const opus_val16 *bandLogE, const opus_val16 | ||||
|             tot_boost += boost_bits; | ||||
|          } | ||||
|       } | ||||
|    } else { | ||||
|       for (i=start;i<end;i++) | ||||
|          importance[i] = 13; | ||||
|    } | ||||
|    *tot_boost_ = tot_boost; | ||||
|    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, | ||||
|       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; | ||||
|    VARDECL(celt_sig, _pre); | ||||
| @@ -1119,7 +1219,12 @@ static int run_prefilter(CELTEncoder *st, celt_sig *in, celt_sig *prefilter_mem, | ||||
|       gain1 = 0; | ||||
|       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 */ | ||||
|    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) | ||||
|       { | ||||
|          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 { | ||||
|          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); | ||||
| 
 | ||||
| @@ -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 constrained_vbr, opus_val16 stereo_saving, int tot_boost, | ||||
|       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) | ||||
| { | ||||
|    /* 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)); | ||||
|    } | ||||
|    /* 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. */ | ||||
|    tf_calibration = variable_duration==OPUS_FRAMESIZE_VARIABLE ? | ||||
|                     QCONST16(0.02f,14) : QCONST16(0.04f,14); | ||||
|    tf_calibration = QCONST16(0.044f,14); | ||||
|    target += (opus_int32)SHL32(MULT16_32_Q15(tf_estimate-tf_calibration, target),1); | ||||
| 
 | ||||
| #ifndef DISABLE_FLOAT_API | ||||
| @@ -1249,7 +1353,7 @@ static int compute_vbr(const CELTMode *mode, AnalysisInfo *analysis, opus_int32 | ||||
|       float tonal; | ||||
| 
 | ||||
|       /* 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); | ||||
|       if (pitch_change) | ||||
|          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);*/ | ||||
|    } | ||||
| 
 | ||||
|    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; | ||||
| #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); | ||||
| 
 | ||||
|       target = base_target + (opus_int32)MULT16_32_Q15(QCONST16(0.67f, 15), target-base_target); | ||||
|    } | ||||
| 
 | ||||
|    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, cap); | ||||
|    VARDECL(int, offsets); | ||||
|    VARDECL(int, importance); | ||||
|    VARDECL(int, spread_weight); | ||||
|    VARDECL(int, fine_priority); | ||||
|    VARDECL(int, tf_res); | ||||
|    VARDECL(unsigned char, collapse_masks); | ||||
|    celt_sig *prefilter_mem; | ||||
|    opus_val16 *oldBandE, *oldLogE, *oldLogE2; | ||||
|    opus_val16 *oldBandE, *oldLogE, *oldLogE2, *energyError; | ||||
|    int shortBlocks=0; | ||||
|    int isTransient=0; | ||||
|    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 effEnd; | ||||
|    int codedBands; | ||||
|    int tf_sum; | ||||
|    int alloc_trim; | ||||
|    int pitch_index=COMBFILTER_MINPERIOD; | ||||
|    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 balance; | ||||
|    opus_int32 tell; | ||||
|    opus_int32 tell0_frac; | ||||
|    int prefilter_tapset=0; | ||||
|    int pf_on; | ||||
|    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 temporal_vbr=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); | ||||
|    ALLOC_STACK; | ||||
| 
 | ||||
| @@ -1383,6 +1485,7 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, | ||||
|    eBands = mode->eBands; | ||||
|    start = st->start; | ||||
|    end = st->end; | ||||
|    hybrid = start != 0; | ||||
|    tf_estimate = 0; | ||||
|    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)); | ||||
|    oldLogE = oldBandE + CC*nbEBands; | ||||
|    oldLogE2 = oldLogE + CC*nbEBands; | ||||
|    energyError = oldLogE2 + CC*nbEBands; | ||||
| 
 | ||||
|    if (enc==NULL) | ||||
|    { | ||||
|       tell=1; | ||||
|       tell0_frac=tell=1; | ||||
|       nbFilledBytes=0; | ||||
|    } else { | ||||
|       tell0_frac=ec_tell_frac(enc); | ||||
|       tell=ec_tell(enc); | ||||
|       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) | ||||
|          nbCompressedBytes = IMAX(2, IMIN(nbCompressedBytes, | ||||
|                (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) | ||||
|       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) | ||||
|    { | ||||
| @@ -1555,17 +1661,17 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, | ||||
|    { | ||||
|       int enabled; | ||||
|       int qg; | ||||
|       enabled = ((st->lfe&&nbAvailableBytes>3) || nbAvailableBytes>12*C) && start==0 && !silence && !st->disable_pf | ||||
|             && st->complexity >= 5 && !(st->consec_transient && LM!=3 && st->variable_duration==OPUS_FRAMESIZE_VARIABLE); | ||||
|       enabled = ((st->lfe&&nbAvailableBytes>3) || nbAvailableBytes>12*C) && !hybrid && !silence && !st->disable_pf | ||||
|             && st->complexity >= 5; | ||||
| 
 | ||||
|       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) | ||||
|             && (pitch_index > 1.26*st->prefilter_period || pitch_index < .79*st->prefilter_period)) | ||||
|          pitch_change = 1; | ||||
|       if (pf_on==0) | ||||
|       { | ||||
|          if(start==0 && tell+16<=total_bits) | ||||
|          if(!hybrid && tell+16<=total_bits) | ||||
|             ec_enc_bit_logp(enc, 0, 1); | ||||
|       } else { | ||||
|          /*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; | ||||
|    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, | ||||
|             &tf_estimate, &tf_chan); | ||||
|             &tf_estimate, &tf_chan, allow_weak_transients, &weak_transient); | ||||
|    } | ||||
|    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) | ||||
|    { | ||||
|       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); | ||||
|       for (i=0;i<C*nbEBands;i++) | ||||
|          bandLogE2[i] += HALF16(SHL16(LM, DB_SHIFT)); | ||||
|    } | ||||
| 
 | ||||
|    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) | ||||
|       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) | ||||
|    { | ||||
| @@ -1631,7 +1744,7 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, | ||||
|    ALLOC(surround_dynalloc, C*nbEBands, opus_val16); | ||||
|    OPUS_CLEAR(surround_dynalloc, end); | ||||
|    /* 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 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
 | ||||
|       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)) | ||||
|       { | ||||
|          isTransient = 1; | ||||
|          shortBlocks = M; | ||||
|          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); | ||||
|          /* Compensate for the scaling of short vs long mdcts */ | ||||
|          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 */ | ||||
|    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); | ||||
|    /* 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; | ||||
|       if (effectiveBytes<40) | ||||
|          lambda = 12; | ||||
|       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); | ||||
|       lambda = IMAX(80, 20480/effectiveBytes + 2); | ||||
|       tf_select = tf_analysis(mode, effEnd, isTransient, tf_res, lambda, X, N, LM, tf_estimate, tf_chan, importance); | ||||
|       for (i=effEnd;i<end;i++) | ||||
|          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 { | ||||
|       tf_sum = 0; | ||||
|       for (i=0;i<end;i++) | ||||
|          tf_res[i] = isTransient; | ||||
|       tf_select=0; | ||||
|    } | ||||
| 
 | ||||
|    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, | ||||
|          oldBandE, total_bits, error, enc, | ||||
|          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->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) | ||||
|             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->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("%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); | ||||
|    } | ||||
| 
 | ||||
|    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 */ | ||||
|    if (st->lfe) | ||||
|       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; | ||||
|    if (tell+(6<<BITRES) <= total_bits - total_boost) | ||||
|    { | ||||
|       if (st->lfe) | ||||
|       if (start > 0 || st->lfe) | ||||
|       { | ||||
|          st->stereo_saving = 0; | ||||
|          alloc_trim = 5; | ||||
|       else | ||||
|       } else { | ||||
|          alloc_trim = alloc_trim_analysis(mode, X, bandLogE, | ||||
|             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); | ||||
|       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.
 | ||||
|         The CELT allocator will just not be able to use more than that anyway. */ | ||||
|      nbCompressedBytes = IMIN(nbCompressedBytes,1275>>(3-LM)); | ||||
|      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) | ||||
|         base_target += (st->vbr_offset>>lm_diff); | ||||
| 
 | ||||
|      if (!hybrid) | ||||
|      { | ||||
|         target = compute_vbr(mode, &st->analysis, base_target, LM, equiv_rate, | ||||
|            st->lastCodedBands, C, st->intensity, st->constrained_vbr, | ||||
|            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); | ||||
| 
 | ||||
|      } 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
 | ||||
|         so far is added*/ | ||||
|      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. | ||||
|         The margin of 2 bytes ensures that none of the bust-prevention logic | ||||
|          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 = 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 */ | ||||
|      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; | ||||
|         /*printf ("+%d\n", adjust);*/ | ||||
|      } | ||||
|      nbCompressedBytes = IMIN(nbCompressedBytes,nbAvailableBytes+nbFilledBytes); | ||||
|      nbCompressedBytes = IMIN(nbCompressedBytes,nbAvailableBytes); | ||||
|      /*printf("%d\n", nbCompressedBytes*50*8);*/ | ||||
|      /* This moves the raw bits to take into account the new compressed size */ | ||||
|      ec_enc_shrink(enc, nbCompressedBytes); | ||||
| @@ -2020,7 +2191,7 @@ int celt_encode_with_ec(CELTEncoder * OPUS_RESTRICT st, const opus_val16 * pcm, | ||||
| #endif | ||||
|    if (st->lfe) | ||||
|       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, | ||||
|          fine_quant, fine_priority, C, LM, enc, 1, st->lastCodedBands, signalBandwidth); | ||||
|    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, | ||||
|          bandE, pulses, shortBlocks, st->spread_decision, | ||||
|          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) | ||||
|    { | ||||
| @@ -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); | ||||
|    } | ||||
|    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) | ||||
|    { | ||||
| @@ -2318,10 +2497,24 @@ int opus_custom_encoder_ctl(CELTEncoder * OPUS_RESTRICT st, int request, ...) | ||||
|           *value=st->lsb_depth; | ||||
|       } | ||||
|       break; | ||||
|       case OPUS_SET_EXPERT_FRAME_DURATION_REQUEST: | ||||
|       case OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST: | ||||
|       { | ||||
|           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; | ||||
|       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); | ||||
|       } | ||||
|       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: | ||||
|       { | ||||
|          const CELTMode ** value = va_arg(ap, const CELTMode**); | ||||
| @@ -49,8 +49,7 @@ int          p | ||||
|    float *lpc = _lpc; | ||||
| #endif | ||||
| 
 | ||||
|    for (i = 0; i < p; i++) | ||||
|       lpc[i] = 0; | ||||
|    OPUS_CLEAR(lpc, p); | ||||
|    if (ac[0] != 0) | ||||
|    { | ||||
|       for (i = 0; i < p; i++) { | ||||
| @@ -90,58 +89,40 @@ int          p | ||||
| 
 | ||||
| 
 | ||||
| void celt_fir_c( | ||||
|          const opus_val16 *_x, | ||||
|          const opus_val16 *x, | ||||
|          const opus_val16 *num, | ||||
|          opus_val16 *_y, | ||||
|          opus_val16 *y, | ||||
|          int N, | ||||
|          int ord, | ||||
|          opus_val16 *mem, | ||||
|          int arch) | ||||
| { | ||||
|    int i,j; | ||||
|    VARDECL(opus_val16, rnum); | ||||
|    VARDECL(opus_val16, x); | ||||
|    SAVE_STACK; | ||||
| 
 | ||||
|    celt_assert(x != y); | ||||
|    ALLOC(rnum, ord, opus_val16); | ||||
|    ALLOC(x, N+ord, opus_val16); | ||||
|    for(i=0;i<ord;i++) | ||||
|       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) | ||||
|    { | ||||
|       opus_val32 sum[4]={0,0,0,0}; | ||||
|       xcorr_kernel(rnum, x+i, sum, ord, arch); | ||||
|       _y[i  ] = SATURATE16(ADD32(EXTEND32(_x[i  ]), PSHR32(sum[0], SIG_SHIFT))); | ||||
|       _y[i+1] = SATURATE16(ADD32(EXTEND32(_x[i+1]), PSHR32(sum[1], SIG_SHIFT))); | ||||
|       _y[i+2] = SATURATE16(ADD32(EXTEND32(_x[i+2]), PSHR32(sum[2], SIG_SHIFT))); | ||||
|       _y[i+3] = SATURATE16(ADD32(EXTEND32(_x[i+3]), PSHR32(sum[3], SIG_SHIFT))); | ||||
|       opus_val32 sum[4]; | ||||
|       sum[0] = SHL32(EXTEND32(x[i  ]), SIG_SHIFT); | ||||
|       sum[1] = SHL32(EXTEND32(x[i+1]), SIG_SHIFT); | ||||
|       sum[2] = SHL32(EXTEND32(x[i+2]), SIG_SHIFT); | ||||
|       sum[3] = SHL32(EXTEND32(x[i+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++) | ||||
|    { | ||||
|       opus_val32 sum = 0; | ||||
|       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(ADD32(EXTEND32(_x[i]), PSHR32(sum, SIG_SHIFT))); | ||||
|          sum = MAC16_16(sum,rnum[j],x[i+j-ord]); | ||||
|       y[i] = ROUND16(sum, SIG_SHIFT); | ||||
|    } | ||||
| #endif | ||||
|    RESTORE_STACK; | ||||
| } | ||||
| 
 | ||||
| @@ -167,7 +148,7 @@ void celt_iir(const opus_val32 *_x, | ||||
|       { | ||||
|          mem[j]=mem[j-1]; | ||||
|       } | ||||
|       mem[0] = ROUND16(sum,SIG_SHIFT); | ||||
|       mem[0] = SROUND16(sum, SIG_SHIFT); | ||||
|       _y[i] = sum; | ||||
|    } | ||||
| #else | ||||
| @@ -196,20 +177,20 @@ void celt_iir(const opus_val32 *_x, | ||||
|       xcorr_kernel(rden, y+i, sum, ord, arch); | ||||
| 
 | ||||
|       /* 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]; | ||||
|       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]; | ||||
|       sum[2] = MAC16_16(sum[2], y[i+ord+1], den[0]); | ||||
|       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]; | ||||
| 
 | ||||
|       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  ], 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]; | ||||
|    } | ||||
|    for (;i<N;i++) | ||||
| @@ -217,7 +198,7 @@ void celt_iir(const opus_val32 *_x, | ||||
|       opus_val32 sum = _x[i]; | ||||
|       for (j=0;j<ord;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; | ||||
|    } | ||||
|    for(i=0;i<ord;i++) | ||||
| @@ -45,12 +45,11 @@ void celt_fir_c( | ||||
|          opus_val16 *y, | ||||
|          int N, | ||||
|          int ord, | ||||
|          opus_val16 *mem, | ||||
|          int arch); | ||||
| 
 | ||||
| #if !defined(OVERRIDE_CELT_FIR) | ||||
| #define celt_fir(x, num, y, N, ord, mem, arch) \ | ||||
|     (celt_fir_c(x, num, y, N, ord, mem, arch)) | ||||
| #define celt_fir(x, num, y, N, ord, arch) \ | ||||
|     (celt_fir_c(x, num, y, N, ord, arch)) | ||||
| #endif | ||||
| 
 | ||||
| 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
 | ||||
|    a Pyramid Vector Quantizer \cite{Fis86}. | ||||
|   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. | ||||
| 
 | ||||
|   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; | ||||
|       q=row[_n]; | ||||
|       if(q>_i){ | ||||
|         celt_assert(p>q); | ||||
|         celt_sig_assert(p>q); | ||||
|         _k=_n; | ||||
|         do p=CELT_PVQ_U_ROW[--_k][_n]; | ||||
|         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 */ | ||||
| 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 | ||||
|    if (d>256) | ||||
|       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) { | ||||
|    celt_assert(d>0); | ||||
|    celt_sig_assert(d>0); | ||||
| #ifdef USE_SMALL_DIV_TABLE | ||||
|    if (n<0) | ||||
|       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(). | ||||
|   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). | ||||
|        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.*/ | ||||
| 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.
 | ||||
|   _fl: The integer to encode. | ||||
|   _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); | ||||
| 
 | ||||
| /*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 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) | ||||
| { | ||||
|    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 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 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__) | ||||
| 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)) | ||||
| 
 | ||||
| /** 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)) | ||||
| #endif | ||||
| 
 | ||||
| /** 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)) | ||||
| #endif | ||||
| 
 | ||||
| /** 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)) | ||||
| #endif | ||||
| 
 | ||||
| /** 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)) | ||||
| #endif | ||||
| 
 | ||||
| /** Compile-time conversion of float constant to 16-bit value */ | ||||
| #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 */ | ||||
| #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 */ | ||||
| #define HALF16(x)  (SHR16(x,1)) | ||||
| #define HALF32(x)  (SHR32(x,1)) | ||||
| @@ -101,6 +120,14 @@ | ||||
| /** Subtract two 32-bit values */ | ||||
| #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 */ | ||||
| #define MULT16_16_16(a,b)     ((((opus_val16)(a))*((opus_val16)(b)))) | ||||
| 
 | ||||
| @@ -61,7 +61,13 @@ | ||||
| **      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
 | ||||
| **      standard. They must be defined before the inclusion of math.h to | ||||
| @@ -90,10 +96,10 @@ | ||||
| #include <math.h> | ||||
| #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> | ||||
| 
 | ||||
|         __inline long int float2int(float value) | ||||
|         static __inline long int float2int(float value) | ||||
|         { | ||||
|                 return _mm_cvtss_si32(_mm_load_ss(&value)); | ||||
|         } | ||||
| @@ -104,7 +110,7 @@ | ||||
|         **      Therefore implement OPUS_INLINE versions of these functions here. | ||||
|         */ | ||||
| 
 | ||||
|         __inline long int | ||||
|         static __inline long int | ||||
|         float2int (float flt) | ||||
|         {       int intgr; | ||||
| 
 | ||||
| @@ -82,8 +82,8 @@ static void kf_bfly2( | ||||
|          C_SUB( Fout2[0] ,  Fout[0] , t ); | ||||
|          C_ADDTO( Fout[0] ,  t ); | ||||
| 
 | ||||
|          t.r = S_MUL(Fout2[1].r+Fout2[1].i, tw); | ||||
|          t.i = S_MUL(Fout2[1].i-Fout2[1].r, tw); | ||||
|          t.r = S_MUL(ADD32_ovflw(Fout2[1].r, Fout2[1].i), tw); | ||||
|          t.i = S_MUL(SUB32_ovflw(Fout2[1].i, Fout2[1].r), tw); | ||||
|          C_SUB( Fout2[1] ,  Fout[1] , t ); | ||||
|          C_ADDTO( Fout[1] ,  t ); | ||||
| 
 | ||||
| @@ -92,8 +92,8 @@ static void kf_bfly2( | ||||
|          C_SUB( Fout2[2] ,  Fout[2] , t ); | ||||
|          C_ADDTO( Fout[2] ,  t ); | ||||
| 
 | ||||
|          t.r = S_MUL(Fout2[3].i-Fout2[3].r, tw); | ||||
|          t.i = 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(NEG32_ovflw(ADD32_ovflw(Fout2[3].i, Fout2[3].r)), tw); | ||||
|          C_SUB( Fout2[3] ,  Fout[3] , t ); | ||||
|          C_ADDTO( Fout[3] ,  t ); | ||||
|          Fout += 8; | ||||
| @@ -126,10 +126,10 @@ static void kf_bfly4( | ||||
|          C_ADDTO( *Fout , scratch1 ); | ||||
|          C_SUB( scratch1 , Fout[1] , Fout[3] ); | ||||
| 
 | ||||
|          Fout[1].r = scratch0.r + scratch1.i; | ||||
|          Fout[1].i = scratch0.i - scratch1.r; | ||||
|          Fout[3].r = scratch0.r - scratch1.i; | ||||
|          Fout[3].i = scratch0.i + scratch1.r; | ||||
|          Fout[1].r = ADD32_ovflw(scratch0.r, scratch1.i); | ||||
|          Fout[1].i = SUB32_ovflw(scratch0.i, scratch1.r); | ||||
|          Fout[3].r = SUB32_ovflw(scratch0.r, scratch1.i); | ||||
|          Fout[3].i = ADD32_ovflw(scratch0.i, scratch1.r); | ||||
|          Fout+=4; | ||||
|       } | ||||
|    } else { | ||||
| @@ -160,10 +160,10 @@ static void kf_bfly4( | ||||
|             tw3 += fstride*3; | ||||
|             C_ADDTO( *Fout , scratch[3] ); | ||||
| 
 | ||||
|             Fout[m].r = scratch[5].r + scratch[4].i; | ||||
|             Fout[m].i = scratch[5].i - scratch[4].r; | ||||
|             Fout[m3].r = scratch[5].r - scratch[4].i; | ||||
|             Fout[m3].i = scratch[5].i + scratch[4].r; | ||||
|             Fout[m].r = ADD32_ovflw(scratch[5].r, scratch[4].i); | ||||
|             Fout[m].i = SUB32_ovflw(scratch[5].i, scratch[4].r); | ||||
|             Fout[m3].r = SUB32_ovflw(scratch[5].r, scratch[4].i); | ||||
|             Fout[m3].i = ADD32_ovflw(scratch[5].i, scratch[4].r); | ||||
|             ++Fout; | ||||
|          } | ||||
|       } | ||||
| @@ -191,7 +191,7 @@ static void kf_bfly3( | ||||
| 
 | ||||
|    kiss_fft_cpx * Fout_beg = Fout; | ||||
| #ifdef FIXED_POINT | ||||
|    epi3.r = -16384; | ||||
|    /*epi3.r = -16384;*/ /* Unused */ | ||||
|    epi3.i = -28378; | ||||
| #else | ||||
|    epi3 = st->twiddles[fstride*m]; | ||||
| @@ -212,18 +212,18 @@ static void kf_bfly3( | ||||
|          tw1 += fstride; | ||||
|          tw2 += fstride*2; | ||||
| 
 | ||||
|          Fout[m].r = Fout->r - HALF_OF(scratch[3].r); | ||||
|          Fout[m].i = Fout->i - HALF_OF(scratch[3].i); | ||||
|          Fout[m].r = SUB32_ovflw(Fout->r, HALF_OF(scratch[3].r)); | ||||
|          Fout[m].i = SUB32_ovflw(Fout->i, HALF_OF(scratch[3].i)); | ||||
| 
 | ||||
|          C_MULBYSCALAR( scratch[0] , epi3.i ); | ||||
| 
 | ||||
|          C_ADDTO(*Fout,scratch[3]); | ||||
| 
 | ||||
|          Fout[m2].r = Fout[m].r + scratch[0].i; | ||||
|          Fout[m2].i = Fout[m].i - scratch[0].r; | ||||
|          Fout[m2].r = ADD32_ovflw(Fout[m].r, scratch[0].i); | ||||
|          Fout[m2].i = SUB32_ovflw(Fout[m].i, scratch[0].r); | ||||
| 
 | ||||
|          Fout[m].r -= scratch[0].i; | ||||
|          Fout[m].i += scratch[0].r; | ||||
|          Fout[m].r = SUB32_ovflw(Fout[m].r, scratch[0].i); | ||||
|          Fout[m].i = ADD32_ovflw(Fout[m].i, scratch[0].r); | ||||
| 
 | ||||
|          ++Fout; | ||||
|       } while(--k); | ||||
| @@ -282,22 +282,22 @@ static void kf_bfly5( | ||||
|          C_ADD( scratch[8],scratch[2],scratch[3]); | ||||
|          C_SUB( scratch[9],scratch[2],scratch[3]); | ||||
| 
 | ||||
|          Fout0->r += scratch[7].r + scratch[8].r; | ||||
|          Fout0->i += scratch[7].i + scratch[8].i; | ||||
|          Fout0->r = ADD32_ovflw(Fout0->r, ADD32_ovflw(scratch[7].r, scratch[8].r)); | ||||
|          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].i = scratch[0].i + S_MUL(scratch[7].i,ya.r) + S_MUL(scratch[8].i,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 = 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].i = -S_MUL(scratch[10].r,ya.i) - S_MUL(scratch[9].r,yb.i); | ||||
|          scratch[6].r =  ADD32_ovflw(S_MUL(scratch[10].i,ya.i), S_MUL(scratch[9].i,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_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].i = scratch[0].i + 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].i = S_MUL(scratch[10].r,yb.i) - S_MUL(scratch[9].r,ya.i); | ||||
|          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 = ADD32_ovflw(scratch[0].i, ADD32_ovflw(S_MUL(scratch[7].i,yb.r), S_MUL(scratch[8].i,ya.r))); | ||||
|          scratch[12].r = SUB32_ovflw(S_MUL(scratch[9].i,ya.i), S_MUL(scratch[10].i,yb.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_SUB(*Fout3,scratch[11],scratch[12]); | ||||
| @@ -38,7 +38,8 @@ | ||||
| #include "mathops.h" | ||||
| 
 | ||||
| /*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 b; | ||||
|   unsigned g; | ||||
| @@ -164,7 +165,7 @@ opus_val16 celt_cos_norm(opus_val32 x) | ||||
|       { | ||||
|          return _celt_cos_pi_2(EXTRACT16(x)); | ||||
|       } else { | ||||
|          return NEG32(_celt_cos_pi_2(EXTRACT16(65536-x))); | ||||
|          return NEG16(_celt_cos_pi_2(EXTRACT16(65536-x))); | ||||
|       } | ||||
|    } else { | ||||
|       if (x&0x0000ffff) | ||||
| @@ -182,7 +183,7 @@ opus_val32 celt_rcp(opus_val32 x) | ||||
|    int i; | ||||
|    opus_val16 n; | ||||
|    opus_val16 r; | ||||
|    celt_assert2(x>0, "celt_rcp() only defined for positive values"); | ||||
|    celt_sig_assert(x>0); | ||||
|    i = celt_ilog2(x); | ||||
|    /* n is Q15 with range [0,1). */ | ||||
|    n = VSHR32(x,i-15)-32768; | ||||
| @@ -38,11 +38,44 @@ | ||||
| #include "entcode.h" | ||||
| #include "os_support.h" | ||||
| 
 | ||||
| #define PI 3.141592653f | ||||
| 
 | ||||
| /* 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) | ||||
| 
 | ||||
| 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 | ||||
| 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 | ||||
| 
 | ||||
| #define PI 3.141592653f | ||||
| #define celt_sqrt(x) ((float)sqrt(x)) | ||||
| #define celt_rsqrt(x) (1.f/celt_sqrt(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 */ | ||||
| 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; | ||||
| } | ||||
| #endif | ||||
| @@ -270,8 +270,8 @@ void clt_mdct_backward_c(const mdct_lookup *l, kiss_fft_scalar *in, kiss_fft_sca | ||||
|          int rev; | ||||
|          kiss_fft_scalar yr, yi; | ||||
|          rev = *bitrev++; | ||||
|          yr = S_MUL(*xp2, t[i]) + S_MUL(*xp1, t[N4+i]); | ||||
|          yi = S_MUL(*xp1, t[i]) - S_MUL(*xp2, t[N4+i]); | ||||
|          yr = ADD32_ovflw(S_MUL(*xp2, t[i]), S_MUL(*xp1, 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. */ | ||||
|          yp[2*rev+1] = yr; | ||||
|          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]; | ||||
|          t1 = t[N4+i]; | ||||
|          /* 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); | ||||
|          yi = S_MUL(re,t1) - S_MUL(im,t0); | ||||
|          yr = ADD32_ovflw(S_MUL(re,t0), S_MUL(im,t1)); | ||||
|          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. */ | ||||
|          re = yp1[1]; | ||||
|          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)]; | ||||
|          t1 = t[(N2-i-1)]; | ||||
|          /* 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); | ||||
|          yi = S_MUL(re,t1) - S_MUL(im,t0); | ||||
|          yr = ADD32_ovflw(S_MUL(re,t0), S_MUL(im,t1)); | ||||
|          yi = SUB32_ovflw(S_MUL(re,t1), S_MUL(im,t0)); | ||||
|          yp1[0] = yr; | ||||
|          yp0[1] = yi; | ||||
|          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; | ||||
|          x1 = *xp1; | ||||
|          x2 = *yp1; | ||||
|          *yp1++ = MULT16_32_Q15(*wp2, x2) - MULT16_32_Q15(*wp1, x1); | ||||
|          *xp1-- = MULT16_32_Q15(*wp1, x2) + MULT16_32_Q15(*wp2, x1); | ||||
|          *yp1++ = SUB32_ovflw(MULT16_32_Q15(*wp2, x2), MULT16_32_Q15(*wp1, x1)); | ||||
|          *xp1-- = ADD32_ovflw(MULT16_32_Q15(*wp1, x2), MULT16_32_Q15(*wp2, x1)); | ||||
|          wp1++; | ||||
|          wp2--; | ||||
|       } | ||||
| @@ -53,6 +53,7 @@ | ||||
| #include "celt_lpc.h" | ||||
| #include "vq.h" | ||||
| 
 | ||||
| #define OVERRIDE_COMB_FILTER_CONST | ||||
| #define OVERRIDE_comb_filter | ||||
| 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, | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user
	 MatteZ02
					MatteZ02