From 7df987bb9cfc6a0cbd4c1e119a9c021c3e8b8c8c Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Wed, 7 Aug 2024 08:42:31 -0400 Subject: [PATCH 1/3] FIX 833 to fix issue introduced in 826 --- Workspace_msvc/decoder.vcxproj | 344 +- Workspace_msvc/encoder.vcxproj | 354 +- Workspace_msvc/lib_com.vcxproj | 840 ++-- Workspace_msvc/lib_debug.vcxproj | 240 +- Workspace_msvc/lib_dec.vcxproj | 936 ++--- Workspace_msvc/lib_dec.vcxproj.filters | 609 +-- Workspace_msvc/lib_enc.vcxproj | 1010 ++--- Workspace_msvc/lib_rend.vcxproj | 414 +- Workspace_msvc/lib_rend.vcxproj.filters | 311 +- Workspace_msvc/lib_util.vcxproj | 312 +- Workspace_msvc/renderer.vcxproj | 358 +- lib_com/options.h | 3 + lib_dec/ivas_stereo_icbwe_dec.c | 4756 +++++++++++------------ lib_enc/igf_enc_fx.c | 1 + 14 files changed, 5245 insertions(+), 5243 deletions(-) diff --git a/Workspace_msvc/decoder.vcxproj b/Workspace_msvc/decoder.vcxproj index ca0d96f44..c88edac1f 100644 --- a/Workspace_msvc/decoder.vcxproj +++ b/Workspace_msvc/decoder.vcxproj @@ -1,173 +1,173 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - decoder - {E3DCBC31-7FC9-D127-E000-529F8460D5FD} - decoder - 10.0.17763.0 - - - - Application - v141 - false - MultiByte - - - Application - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_dec - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_dec - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - true - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - libcmtd.lib - - - - - - - - - - {e822ddaf-0f5f-4cd0-a694-38ae69de74d3} - false - - - {2fa8f384-0775-f3b7-f8c3-85209222fc70} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + decoder + {E3DCBC31-7FC9-D127-E000-529F8460D5FD} + decoder + 10.0.17763.0 + + + + Application + v142 + false + MultiByte + + + Application + v142 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_dec + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_dec + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + true + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + libcmtd.lib + + + + + + + + + + {e822ddaf-0f5f-4cd0-a694-38ae69de74d3} + false + + + {2fa8f384-0775-f3b7-f8c3-85209222fc70} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/encoder.vcxproj b/Workspace_msvc/encoder.vcxproj index 9578e488d..3f5e39539 100644 --- a/Workspace_msvc/encoder.vcxproj +++ b/Workspace_msvc/encoder.vcxproj @@ -1,178 +1,178 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - encoder - {B3FC9DFC-7268-8660-7C0D-B60BAF02C554} - encoder - 10.0.17763.0 - - - - Application - v141 - false - MultiByte - - - Application - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_cod - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_cod - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - false - true - $(IntDir)$(ProjectName).pdb - Console - - false - - MachineX86 - - - - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - - - - {824da4cf-06f0-45c9-929a-8792f0e19c3e} - false - - - {2fa8f384-0775-f3b7-f8c3-85209222fc70} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + encoder + {B3FC9DFC-7268-8660-7C0D-B60BAF02C554} + encoder + 10.0.17763.0 + + + + Application + v142 + false + MultiByte + + + Application + v142 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_cod + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_cod + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + false + true + $(IntDir)$(ProjectName).pdb + Console + + false + + MachineX86 + + + + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + + + + {824da4cf-06f0-45c9-929a-8792f0e19c3e} + false + + + {2fa8f384-0775-f3b7-f8c3-85209222fc70} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_com.vcxproj b/Workspace_msvc/lib_com.vcxproj index 9119a2c38..2c5fbcc2c 100644 --- a/Workspace_msvc/lib_com.vcxproj +++ b/Workspace_msvc/lib_com.vcxproj @@ -1,421 +1,421 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {39EC200D-7795-4FF8-B214-B24EDA5526AE} - common - 10.0.17763.0 - - - - StaticLibrary - v141 - false - MultiByte - - - StaticLibrary - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivascom - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivascom - - - - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {39EC200D-7795-4FF8-B214-B24EDA5526AE} + common + 10.0.17763.0 + + + + StaticLibrary + v142 + false + MultiByte + + + StaticLibrary + v142 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivascom + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivascom + + + + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_debug.vcxproj b/Workspace_msvc/lib_debug.vcxproj index 929dd72a8..89cc0a80d 100644 --- a/Workspace_msvc/lib_debug.vcxproj +++ b/Workspace_msvc/lib_debug.vcxproj @@ -1,121 +1,121 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {54509728-928B-44D9-A118-A6F92F08B34F} - debug - 10.0.17763.0 - - - - StaticLibrary - v141 - MultiByte - - - StaticLibrary - v141 - MultiByte - true - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivasdebug - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivasdebug - - - - - - - Disabled - ..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;DBG_WAV_WRITER;$(Macros);%(PreprocessorDefinitions) - false - - EnableFastChecks - MultiThreadedDebug - false - $(IntDir)$(ProjectName).pdb - Level4 - OldStyle - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - MaxSpeed - AnySuitable - false - false - ..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - $(IntDir)$(ProjectName).pdb - Level4 - - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {54509728-928B-44D9-A118-A6F92F08B34F} + debug + 10.0.17763.0 + + + + StaticLibrary + v142 + MultiByte + + + StaticLibrary + v142 + MultiByte + true + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivasdebug + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivasdebug + + + + + + + Disabled + ..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;DBG_WAV_WRITER;$(Macros);%(PreprocessorDefinitions) + false + + EnableFastChecks + MultiThreadedDebug + false + $(IntDir)$(ProjectName).pdb + Level4 + OldStyle + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + MaxSpeed + AnySuitable + false + false + ..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + $(IntDir)$(ProjectName).pdb + Level4 + + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_dec.vcxproj b/Workspace_msvc/lib_dec.vcxproj index d6e4a7c67..0969d22fb 100644 --- a/Workspace_msvc/lib_dec.vcxproj +++ b/Workspace_msvc/lib_dec.vcxproj @@ -1,469 +1,469 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_dec - {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} - evs_dec - 10.0.17763.0 - - - StaticLibrary - v141 - false - MultiByte - - - - StaticLibrary - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasdec - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasdec - - - - - - - .\Debug\$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - false - - - - false - - - - - - - - - - - - - - - - - - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - {718DE063-A18B-BB72-9150-62B892E6FFA6} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_dec + {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} + evs_dec + 10.0.17763.0 + + + StaticLibrary + v142 + false + MultiByte + + + + StaticLibrary + v142 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasdec + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasdec + + + + + + + .\Debug\$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + false + + + + false + + + + + + + + + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + {718DE063-A18B-BB72-9150-62B892E6FFA6} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_dec.vcxproj.filters b/Workspace_msvc/lib_dec.vcxproj.filters index b9dbd7fd5..22ba510ff 100644 --- a/Workspace_msvc/lib_dec.vcxproj.filters +++ b/Workspace_msvc/lib_dec.vcxproj.filters @@ -1,305 +1,306 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_enc.vcxproj b/Workspace_msvc/lib_enc.vcxproj index 384fb8bb1..bc783ad2b 100644 --- a/Workspace_msvc/lib_enc.vcxproj +++ b/Workspace_msvc/lib_enc.vcxproj @@ -1,506 +1,506 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_enc - {824DA4CF-06F0-45C9-929A-8792F0E19C3E} - evs_enc - 10.0.17763.0 - - - - StaticLibrary - v141 - false - MultiByte - - - StaticLibrary - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasenc - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasenc - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_enc + {824DA4CF-06F0-45C9-929A-8792F0E19C3E} + evs_enc + 10.0.17763.0 + + + + StaticLibrary + v142 + false + MultiByte + + + StaticLibrary + v142 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasenc + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasenc + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_rend.vcxproj b/Workspace_msvc/lib_rend.vcxproj index fa11b23be..6a07ec09c 100644 --- a/Workspace_msvc/lib_rend.vcxproj +++ b/Workspace_msvc/lib_rend.vcxproj @@ -1,208 +1,208 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_rend - {718DE063-A18B-BB72-9150-62B892E6FFA6} - evs_dec - 10.0.17763.0 - - - StaticLibrary - v141 - false - MultiByte - - - - StaticLibrary - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasrend - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasrend - - - - - - - .\Debug\$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_rend + {718DE063-A18B-BB72-9150-62B892E6FFA6} + evs_dec + 10.0.17763.0 + + + StaticLibrary + v142 + false + MultiByte + + + + StaticLibrary + v142 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasrend + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasrend + + + + + + + .\Debug\$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_rend.vcxproj.filters b/Workspace_msvc/lib_rend.vcxproj.filters index 01f3dfb74..630e239e0 100644 --- a/Workspace_msvc/lib_rend.vcxproj.filters +++ b/Workspace_msvc/lib_rend.vcxproj.filters @@ -1,158 +1,155 @@ - - - - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - - - - rend_h - - - rend_h - - - rend_h - - - rend_h - - - rend_h - - - rend_h - - - rend_h - - - - - {54449ece-ef29-44b5-9512-ed8f555851a8} - - - {672b0eb6-cce8-425c-8bf2-aba4b45639bb} - - + + + + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + + + + rend_h + + + rend_h + + + rend_h + + + rend_h + + + rend_h + + + rend_h + + + + + {54449ece-ef29-44b5-9512-ed8f555851a8} + + + {672b0eb6-cce8-425c-8bf2-aba4b45639bb} + + \ No newline at end of file diff --git a/Workspace_msvc/lib_util.vcxproj b/Workspace_msvc/lib_util.vcxproj index 86730b859..aeee3f58e 100644 --- a/Workspace_msvc/lib_util.vcxproj +++ b/Workspace_msvc/lib_util.vcxproj @@ -1,157 +1,157 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {2FA8F384-0775-F3B7-F8C3-85209222FC70} - utility - 10.0.17763.0 - - - - StaticLibrary - v141 - MultiByte - - - StaticLibrary - v141 - MultiByte - true - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - true - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivasutil - - - false - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivasutil - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) - false - - EnableFastChecks - MultiThreadedDebug - false - $(IntDir)$(ProjectName).pdb - Level4 - OldStyle - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - MaxSpeed - AnySuitable - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - $(IntDir)$(ProjectName).pdb - Level4 - - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {2FA8F384-0775-F3B7-F8C3-85209222FC70} + utility + 10.0.17763.0 + + + + StaticLibrary + v142 + MultiByte + + + StaticLibrary + v142 + MultiByte + true + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + true + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivasutil + + + false + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivasutil + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) + false + + EnableFastChecks + MultiThreadedDebug + false + $(IntDir)$(ProjectName).pdb + Level4 + OldStyle + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + MaxSpeed + AnySuitable + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + $(IntDir)$(ProjectName).pdb + Level4 + + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/renderer.vcxproj b/Workspace_msvc/renderer.vcxproj index 1f95040e1..42b329781 100644 --- a/Workspace_msvc/renderer.vcxproj +++ b/Workspace_msvc/renderer.vcxproj @@ -1,180 +1,180 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - renderer - {12B4C8A5-1E06-4E30-B443-D1F916F52B47} - renderer - 10.0.17763.0 - - - - Application - v141 - false - MultiByte - - - Application - v141 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_rend - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_rend - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;..\lib_dec;..\lib_enc;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - true - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - libcmtd.lib - - - - - - - - {54509728-928B-44D9-A118-A6F92F08B34F} - false - - - {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} - false - - - {2FA8F384-0775-F3B7-F8C3-85209222FC70} - false - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {718DE063-A18B-BB72-9150-62B892E6FFA6} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + renderer + {12B4C8A5-1E06-4E30-B443-D1F916F52B47} + renderer + 10.0.17763.0 + + + + Application + v142 + false + MultiByte + + + Application + v142 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_rend + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_rend + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;..\lib_dec;..\lib_enc;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + true + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + libcmtd.lib + + + + + + + + {54509728-928B-44D9-A118-A6F92F08B34F} + false + + + {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} + false + + + {2FA8F384-0775-F3B7-F8C3-85209222FC70} + false + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {718DE063-A18B-BB72-9150-62B892E6FFA6} + false + + + + + + + + + + \ No newline at end of file diff --git a/lib_com/options.h b/lib_com/options.h index 2361ee218..bbaad90f6 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -154,6 +154,9 @@ #define FIX_802_1137_1137_GSC_IVAS_FXFLT_DECODING /* VA: ISSUES 802 and 1137 Made sure that float and fixed point GCS bit allocation is the same during IVAS modes */ #define FIX_810_PREVENT_UNECESSARY_SAT_IN_TC /* VA : Prevent an unnecessary saturation that can happen in TC, have a minimal impact on most cases. Significant improvement for the last segment of LTV when TC is triggered */ #define FIX_826_PRECISION_LOST_AND_COMPL /* VA : Fix lost of precision that leads to unnecessary high noise floor and to some framing artifacts */ +#ifdef FIX_826_PRECISION_LOST_AND_COMPL +#define FIX_833_CORRECTION_to_826 /* VA : fix indexing error introduced in 826 */ +#endif /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_stereo_icbwe_dec.c b/lib_dec/ivas_stereo_icbwe_dec.c index d5acccc7a..3eebbf0b3 100644 --- a/lib_dec/ivas_stereo_icbwe_dec.c +++ b/lib_dec/ivas_stereo_icbwe_dec.c @@ -1,2378 +1,2378 @@ -/****************************************************************************************************** - - (C) 2022-2024 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -#include -#include -#include "options.h" -#include -#include "cnst.h" -#include "ivas_cnst.h" -#include "prot.h" -#include "prot_fx.h" -#include "ivas_prot.h" -#include "ivas_prot_fx.h" -#include "wmc_auto.h" -#include "rom_com.h" -#include "ivas_rom_com.h" -#ifdef IVAS_FLOAT_FIXED -#include "ivas_rom_com_fx.h" -#endif - - -#define Q_icBWE 16 - -/*-------------------------------------------------------------------* - * ic_bwe_dec_reset() - * - * core switching reset of IC BWE memory - *-------------------------------------------------------------------*/ - -#ifndef IVAS_FLOAT_FIXED -static void ic_bwe_dec_reset( - STEREO_ICBWE_DEC_HANDLE hStereoICBWE /* i/o: Stereo ICBWE handle */ -) -{ - /* unscaled & scaled SHB synthesis memory */ - set_f( hStereoICBWE->mem_syn_shb_nonref, 0, L_SHB_LAHEAD ); /* use samples from !acelp) */ - set_f( hStereoICBWE->mem_lpc_shbsynth_nonref, 0, LPC_SHB_ORDER ); - set_f( hStereoICBWE->mem_syn_shb_ola_nonref, 0, L_SHB_LAHEAD ); /* use samples from !acelp) */ - - /* inter-channel BWE SP and GSP mem reset */ - hStereoICBWE->memShbSpecMapping = 0; - - set_f( hStereoICBWE->memShbHilbert_nonref, 0, HILBERT_MEM_SIZE ); - set_f( hStereoICBWE->memShbInterp_nonref, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); - set_f( hStereoICBWE->memShb_fsout_nonref, 0, INTERP_3_2_MEM_LEN ); - hStereoICBWE->syn_dm_phase_nonref = 0; - - return; -} -#else -static void ic_bwe_dec_reset_fx( - STEREO_ICBWE_DEC_HANDLE hStereoICBWE /* i/o: Stereo ICBWE handle */ -) -{ - /* unscaled & scaled SHB synthesis memory */ - set32_fx( hStereoICBWE->mem_syn_shb_nonref_fx, 0, L_SHB_LAHEAD ); /* use samples from !acelp) */ - set32_fx( hStereoICBWE->mem_lpc_shbsynth_nonref_fx, 0, LPC_SHB_ORDER ); - set32_fx( hStereoICBWE->mem_syn_shb_ola_nonref_fx, 0, L_SHB_LAHEAD ); /* use samples from !acelp) */ - - hStereoICBWE->prev_Q_syn_shb_nonref = 31; - move16(); - hStereoICBWE->prev_Q_lpc_shbsynth_nonref = 31; - move16(); - hStereoICBWE->prev_Q_syn_shb_ola_nonref = 31; - move16(); - - /* inter-channel BWE SP and GSP mem reset */ - hStereoICBWE->memShbSpecMapping_fx = 0; - move32(); - hStereoICBWE->prev_Q_memshbspec = 31; - move16(); - - set32_fx( hStereoICBWE->memShbHilbert_nonref_fx, 0, HILBERT_MEM_SIZE ); - set32_fx( hStereoICBWE->memShbInterp_nonref_fx, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); - set32_fx( hStereoICBWE->memShb_fsout_nonref_fx, 0, INTERP_3_2_MEM_LEN ); - - hStereoICBWE->prev_Q_hilb = 31; - move16(); - hStereoICBWE->prev_Q_interp = 31; - move16(); - hStereoICBWE->prev_Q_fsout = 31; - move16(); - - hStereoICBWE->syn_dm_phase_nonref = 0; - move16(); - - return; -} -#endif - - -#ifndef IVAS_FLOAT_FIXED -/*-------------------------------------------------------------------* - * stereo_icBWE_dec() - * - * Spatial mapping of reference to the non-reference channels in SHB - *-------------------------------------------------------------------*/ - -void stereo_icBWE_dec( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - float *synthRef, /* i/o: Reference channel HB synthesis at output Fs */ - float *synth, /* o : Non reference channel HB synthesis at output Fs */ - const float *fb_synth_ref, /* i : ref. high-band synthesis 16-20 kHz */ - const float *voice_factors, /* i : voicing factors */ - const int16_t output_frame /* i : frame length */ -) -{ - int16_t i, j, k, nbSubFr; - Decoder_State *st; /* i/o: decoder state structure, primary channel */ - int16_t spIndx, gsIndx; - float excSHB_nonref[L_FRAME16k]; - float shb_synth_nonref[L_FRAME16k + L_SHB_LAHEAD]; - float error[L_FRAME32k]; - float nlMixFac[NB_SUBFR16k]; - float gsMapping, specMapping; - float fb_synth_nonref[L_FRAME48k]; - float scale, prev_pow, curr_pow, temp; - float alpha, winSlope, winLen, prevgsMapping; - float temp1, temp2; - float icbweM2Ref, ratio_L; - - STEREO_DFT_DEC_DATA_HANDLE hStereoDft = hCPE->hStereoDft; - STEREO_ICBWE_DEC_HANDLE hStereoICBWE = hCPE->hStereoICBWE; - st = hCPE->hCoreCoder[0]; - - /*--------------------------------------------------------------------* - * skip IC-BWE in case of mono DMX output * - * -------------------------------------------------------------------*/ - - if ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode > STEREO_DFT_RES_COD_OFF ) - { - hCPE->hStereoDft->core_hist[0] = st->core; - - return; - } - else if ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->nchan_out == 1 ) - { - - return; - } - - /*--------------------------------------------------------------------* - * skip IC-BWE in case of SID or NO_DATA frame - * -------------------------------------------------------------------*/ - - if ( st->core_brate <= SID_2k40 ) - { - return; - } - - /*--------------------------------------------------------------------* - * TD high band stereo filling * - * -------------------------------------------------------------------*/ - - /* update buffers for TD stereo filling */ - if ( hCPE->element_mode == IVAS_CPE_DFT ) - { - float hb_nrg = EPSILON; - float hb_nrg2 = EPSILON; - - if ( st->core == ACELP_CORE || st->last_core == ACELP_CORE ) - { - for ( i = 0; i < output_frame / 2; i++ ) - { - hb_nrg2 += synthRef[i] * synthRef[i]; - } - - hCPE->hStereoDft->hb_nrg_subr[0] = hb_nrg2; - hb_nrg += hb_nrg2; - hb_nrg2 = EPSILON; - - for ( ; i < output_frame; i++ ) - { - hb_nrg2 += synthRef[i] * synthRef[i]; - } - - hCPE->hStereoDft->hb_nrg_subr[1] = hb_nrg2; - hb_nrg += hb_nrg2; - - mvr2r( synthRef, hCPE->hStereoDft->hb_stefi_sig + hCPE->hStereoDft->hb_stefi_delay, output_frame ); - } - else - { - set_zero( hCPE->hStereoDft->hb_stefi_sig + hCPE->hStereoDft->hb_stefi_delay, output_frame ); - } - hCPE->hStereoDft->hb_nrg_subr[0] *= hCPE->hStereoDft->NFFT / 2; - hCPE->hStereoDft->hb_nrg_subr[1] *= hCPE->hStereoDft->NFFT / 2; - hCPE->hStereoDft->hb_nrg[0] = hb_nrg; - hCPE->hStereoDft->td_gain[0] = 0; - hCPE->hStereoDft->core_hist[0] = st->core; - } - - /*--------------------------------------------------------------------* - * IC-BWE * - * -------------------------------------------------------------------*/ - - if ( st->core != ACELP_CORE || st->extl == -1 || ( hCPE->element_mode == IVAS_CPE_TD && hCPE->hCoreCoder[0]->tdm_LRTD_flag ) ) - { - return; - } - else if ( hCPE->element_mode == IVAS_CPE_DFT && st->core_brate <= SID_2k40 ) - { - mvr2r( synthRef, synth, output_frame ); - return; - } - - - set_f( fb_synth_nonref, 0, L_FRAME48k ); - - /* core switching reset */ - if ( st->last_core != ACELP_CORE || st->bwidth == WB ) - { - ic_bwe_dec_reset( hStereoICBWE ); - - if ( st->last_core != ACELP_CORE ) - { - hStereoICBWE->prevSpecMapping = 0.0f; - hStereoICBWE->prevgsMapping = 1.0f; - hStereoICBWE->icbweM2Ref_prev = 1.0f; - } - - if ( st->bwidth == WB ) - { - /* copy to outputHB and reset hb_synth values */ - mvr2r( synthRef, synth, output_frame ); - - if ( st->element_mode == IVAS_CPE_TD ) - { - hStereoICBWE->prevSpecMapping = 0.0f; - hStereoICBWE->prevgsMapping = 1.0f; - hStereoICBWE->icbweM2Ref_prev = 1.0f; - } - else if ( st->element_mode == IVAS_CPE_DFT ) - { - hStereoICBWE->refChanIndx_bwe = L_CH_INDX; - hStereoICBWE->prevSpecMapping = 0.0f; - - prevgsMapping = hStereoICBWE->prevgsMapping; - temp1 = hStereoDft->side_gain[2 * STEREO_DFT_BAND_MAX + hStereoDft->nbands - 1]; - icbweM2Ref = 1.f + temp1; - gsMapping = 1.f - temp1; - - winLen = (int16_t) ( ( SHB_OVERLAP_LEN * st->output_Fs ) / 16000 ); - winSlope = 1.0f / winLen; - alpha = winSlope; - for ( i = 0; i < winLen; i++ ) - { - synthRef[i] *= ( alpha * ( icbweM2Ref ) + ( 1.0f - alpha ) * ( hStereoICBWE->icbweM2Ref_prev ) ); - synth[i] *= ( alpha * ( gsMapping ) + ( 1.0f - alpha ) * ( prevgsMapping ) ); - alpha += winSlope; - } - for ( ; i < NS2SA( st->output_Fs, FRAME_SIZE_NS ); i++ ) - { - synthRef[i] *= ( icbweM2Ref ); - synth[i] *= ( gsMapping ); - } - hStereoICBWE->icbweM2Ref_prev = icbweM2Ref; - hStereoICBWE->prevgsMapping = gsMapping; - } - - return; - } - } - - if ( !st->bfi ) - { - hStereoICBWE->refChanIndx_bwe = get_next_indice( st, STEREO_ICBWE_REFBITS ); - if ( st->flag_ACELP16k == 1 ) - { - spIndx = get_next_indice( st, STEREO_ICBWE_SPBITS ); - } - else - { - spIndx = 3; - } - if ( st->element_mode == IVAS_CPE_TD ) - { - gsIndx = get_next_indice( st, STEREO_ICBWE_GSBITS ); - } - else - { - gsIndx = get_next_indice( st, STEREO_ICBWE_GSBITS_DFT ); - } - - /* Store indices in case of frame loss */ - hStereoICBWE->prev_spIndx = spIndx; - hStereoICBWE->prev_gsIndx = gsIndx; - } - else /*bfi*/ - { - /* Retrieve last decoded indices */ - spIndx = hStereoICBWE->prev_spIndx; - gsIndx = hStereoICBWE->prev_gsIndx; - hStereoICBWE->refChanIndx_bwe = hStereoICBWE->prev_refChanIndx_bwe; - } - - /* IC-BWE parameter de-quant */ - /* sp Mapping */ - hStereoICBWE->prevSpecMapping = usdequant( spIndx, -0.6f, 0.2f ); - - /* gs Mapping */ - prevgsMapping = hStereoICBWE->prevgsMapping; - - if ( st->element_mode == IVAS_CPE_TD ) - { - hStereoICBWE->prevgsMapping = icbwe_gsMapping_tbl[gsIndx]; - } - else - { - hStereoICBWE->prevgsMapping = icbwe_gsMappingDFT_tbl[gsIndx]; - } - - hStereoICBWE->prevgsMapping = powf( 10, hStereoICBWE->prevgsMapping ); - - specMapping = hStereoICBWE->prevSpecMapping; - gsMapping = hStereoICBWE->prevgsMapping; - - if ( ( st->extl == SWB_TBE || st->extl == FB_TBE ) && st->flag_ACELP16k == 1 ) - { - mvr2r( voice_factors, nlMixFac, NB_SUBFR16k ); - if ( hCPE->hStereoDftDmx != NULL ) - { - if ( hCPE->hStereoDftDmx->targetGain < 0.5f || hCPE->hStereoDftDmx->targetGain > 2.0f ) - { - v_multc( voice_factors, 0.5f, nlMixFac, NB_SUBFR16k ); - } - } - else - { - if ( hCPE->hStereoTCA->targetGain < 0.5f || hCPE->hStereoTCA->targetGain > 2.0f ) - { - v_multc( voice_factors, 0.5f, nlMixFac, NB_SUBFR16k ); - } - } - - nbSubFr = ( st->flag_ACELP16k == 0 ) ? NB_SUBFR : NB_SUBFR16k; - for ( i = 0, k = 0; i < nbSubFr; i++ ) - { - if ( hCPE->hCoreCoder[0]->coder_type == UNVOICED || hStereoICBWE->MSFlag == 1 ) - { - temp1 = 0; - temp2 = 1.0f; - } - else - { - temp1 = sqrtf( nlMixFac[i] ); - temp2 = sqrtf( 1.0f - nlMixFac[i] ); - } - - for ( j = 0; j < L_FRAME16k / nbSubFr; j++, k++ ) - { - excSHB_nonref[k] = temp1 * hStereoICBWE->nlExc16k[k] + temp2 * hStereoICBWE->mixExc16k[k]; - } - } - - /* LP synthesis */ - mvr2r( hStereoICBWE->mem_syn_shb_nonref, shb_synth_nonref, L_SHB_LAHEAD ); - syn_filt( hStereoICBWE->lpSHBRef, LPC_SHB_ORDER, excSHB_nonref, shb_synth_nonref + L_SHB_LAHEAD, L_FRAME16k, hStereoICBWE->mem_lpc_shbsynth_nonref, 1 ); - - prev_pow = sum2_f( shb_synth_nonref, L_SHB_LAHEAD + 10 ); - curr_pow = sum2_f( shb_synth_nonref + L_SHB_LAHEAD + 10, L_SHB_LAHEAD + 10 ); - - if ( prev_pow == 0 ) - { - scale = 0; - } - else - { - scale = sqrtf( curr_pow / prev_pow ); - } - - for ( i = 0; i < L_SHB_LAHEAD; i++ ) - { - shb_synth_nonref[i] *= scale; - } - - for ( ; i < L_SHB_LAHEAD + 10; i++ ) - { - temp = ( i - 19 ) / 10.0f; - shb_synth_nonref[i] *= ( temp * 1.0f + ( 1.0f - temp ) * scale ); - } - /* spec and gs adjustment */ - deemph( shb_synth_nonref + L_SHB_LAHEAD, specMapping, L_FRAME16k, &( hStereoICBWE->memShbSpecMapping ) ); - mvr2r( shb_synth_nonref + L_FRAME16k, hStereoICBWE->mem_syn_shb_nonref, L_SHB_LAHEAD ); - - ScaleShapedSHB( SHB_OVERLAP_LEN, shb_synth_nonref, hStereoICBWE->mem_syn_shb_ola_nonref, hStereoICBWE->gshapeRef, ( hStereoICBWE->gFrameRef * gsMapping * 0.9f ), window_shb, subwin_shb ); - - if ( st->extl == FB_TBE ) - { - v_multc( fb_synth_ref, gsMapping, fb_synth_nonref, L_FRAME48k ); - } - - /* generate 32kHz SHB synthesis from 12.8(16)kHz signal */ - GenSHBSynth( shb_synth_nonref, error, hStereoICBWE->memShbHilbert_nonref, hStereoICBWE->memShbInterp_nonref, st->L_frame, &( hStereoICBWE->syn_dm_phase_nonref ) ); - } - else - { - mvr2r( synthRef, synth, output_frame ); - - winLen = (int16_t) ( ( SHB_OVERLAP_LEN * st->output_Fs ) / 16000 ); - winSlope = 1.0f / winLen; - alpha = winSlope; - - ratio_L = ( hCPE->element_mode == IVAS_CPE_DFT ) ? ( 0.5f ) : ( tdm_ratio_tabl[hCPE->hStereoTD->tdm_last_ratio_idx] ); - - icbweM2Ref = gsMapping; - if ( hStereoICBWE->refChanIndx_bwe == L_CH_INDX ) - { - if ( ratio_L >= 0.1f ) - { - icbweM2Ref = sqrtf( 0.5f - min( 0.5f, ( 1 - ratio_L ) * ( 1 - ratio_L ) * gsMapping * gsMapping ) ) / ratio_L; - } - } - else - { - if ( ratio_L <= 0.9f ) - { - icbweM2Ref = sqrtf( 0.5f - min( 0.5f, ratio_L * ratio_L * gsMapping * gsMapping ) ) / ( 1 - ratio_L ); - } - } - - icbweM2Ref = max( gsMapping, icbweM2Ref ); - - for ( i = 0; i < winLen; i++ ) - { - synthRef[i] *= ( alpha * ( icbweM2Ref ) + ( 1.0f - alpha ) * ( hStereoICBWE->icbweM2Ref_prev ) ); - synth[i] *= ( alpha * ( gsMapping ) + ( 1.0f - alpha ) * ( prevgsMapping ) ); - alpha += winSlope; - } - for ( ; i < NS2SA( st->output_Fs, FRAME_SIZE_NS ); i++ ) - { - synthRef[i] *= ( icbweM2Ref ); - synth[i] *= ( gsMapping ); - } - hStereoICBWE->icbweM2Ref_prev = icbweM2Ref; - - ic_bwe_dec_reset( hStereoICBWE ); - hStereoICBWE->prevSpecMapping = 0.0f; - - return; - } - - /* resample to output FS */ - if ( st->output_Fs == 48000 ) - { - interpolate_3_over_2_allpass( error, L_FRAME32k, synth, hStereoICBWE->memShb_fsout_nonref ); - } - else if ( st->output_Fs == 32000 ) - { - mvr2r( error, synth, L_FRAME32k ); - } - else if ( st->output_Fs == 16000 ) - { - Decimate_allpass_steep( error, hStereoICBWE->memShb_fsout_nonref, L_FRAME32k, synth ); - } - - - if ( st->extl == FB_TBE && st->output_Fs == 48000 ) - { - v_add( fb_synth_nonref, synth, synth, L_FRAME48k ); - } - - /* copy to outputHB and reset hb_synth values */ - ratio_L = ( hCPE->element_mode == IVAS_CPE_DFT ) ? ( 0.5f ) : ( tdm_ratio_tabl[hCPE->hStereoTD->tdm_last_ratio_idx] ); - - icbweM2Ref = gsMapping; - if ( hStereoICBWE->refChanIndx_bwe == L_CH_INDX ) - { - if ( ratio_L >= 0.1f ) - { - icbweM2Ref = sqrtf( 0.5f - min( 0.5f, ( 1 - ratio_L ) * ( 1 - ratio_L ) * gsMapping * gsMapping ) ) / ratio_L; - } - } - else - { - if ( ratio_L <= 0.9f ) - { - icbweM2Ref = sqrtf( 0.5f - min( 0.5f, ratio_L * ratio_L * gsMapping * gsMapping ) ) / ( 1 - ratio_L ); - } - } - - icbweM2Ref = max( gsMapping, icbweM2Ref ); - - winLen = (int16_t) ( ( SHB_OVERLAP_LEN * st->output_Fs ) / 16000 ); - winSlope = 1.0f / winLen; - alpha = winSlope; - for ( i = 0; i < winLen; i++ ) - { - synthRef[i] *= ( alpha * ( icbweM2Ref ) + ( 1.0f - alpha ) * ( hStereoICBWE->icbweM2Ref_prev ) ); - alpha += winSlope; - } - - for ( ; i < NS2SA( st->output_Fs, FRAME_SIZE_NS ); i++ ) - { - synthRef[i] *= ( icbweM2Ref ); - } - - hStereoICBWE->icbweM2Ref_prev = icbweM2Ref; - - return; -} -#else -static Word16 FindScale( - Word32 *buff, - Word16 len, - Word16 Q_buff, - Word16 Q_prev ) -{ - Word32 maxVal; - Word16 norm_shift, Q_out; - - maximum_abs_32_fx( buff, len, &maxVal ); - norm_shift = norm_l( maxVal ); - if ( maxVal == 0 ) - { - norm_shift = 31; - move16(); - } - - Q_out = s_min( Q_prev, add( Q_buff, norm_shift ) ); - - return Q_out; -} - - -void stereo_icBWE_dec_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - Word32 *synthRef_fx, /* i/o: Reference channel HB synthesis at output Fs Q11 */ - Word32 *synth_fx, /* o : Non reference channel HB synthesis at output Fs Q11 */ - const Word16 *fb_synth_ref_fx, /* i : ref. high-band synthesis 16-20 kHz Q11 */ - const Word16 *voice_factors_fx, /* i : voicing factors Q15 */ - const Word16 output_frame, /* i : frame length */ - Word16 *Q_syn /* i : Q of synth and synthRef buffers */ -) -{ - Word16 i, j, k, nbSubFr; - Decoder_State *st; /* i/o: decoder state structure, primary channel */ - Word16 spIndx, gsIndx; - Word32 excSHB_nonref_fx[L_FRAME16k]; - Word32 shb_synth_nonref_fx[L_FRAME16k + L_SHB_LAHEAD]; - Word32 error_fx[L_FRAME32k]; - Word16 nlMixFac_fx[NB_SUBFR16k]; - Word16 specMapping_fx; - Word16 fb_synth_nonref_fx[L_FRAME48k]; - Word32 prev_pow_fx, curr_pow_fx, maxVal1, maxVal; - Word16 scale_fx, e_scale_fx; - Word16 alpha_fx, winSlope_fx, winLen_fx; - Word16 prevgsMapping_fx; - Word16 temp1_fx, temp2_fx; - Word16 icbweM2Ref_fx, ratio_L_fx; - Word16 gsMapping_fx; -#ifndef FIX_826_PRECISION_LOST_AND_COMPL - Word32 hb_nrg_fx, hb_nrg2_fx; -#else - Word32 hb_nrg_fx; -#endif - Word16 Q_syn_shb; - Word16 shift_prev_pow, synthRef_shift; - Word32 L_tmp; - Word16 tmp; - Word32 L_nlExc16k, L_mixExc16k; - - STEREO_DFT_DEC_DATA_HANDLE hStereoDft = hCPE->hStereoDft; - STEREO_ICBWE_DEC_HANDLE hStereoICBWE = hCPE->hStereoICBWE; - st = hCPE->hCoreCoder[0]; - - /*--------------------------------------------------------------------* - * skip IC-BWE in case of mono DMX output * - * -------------------------------------------------------------------*/ - - test(); - test(); - test(); - IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && EQ_16( hCPE->nchan_out, 1 ) && GT_16( hCPE->hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) ) - { - hCPE->hStereoDft->core_hist[0] = st->core; - move16(); - - return; - } - ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && EQ_16( hCPE->nchan_out, 1 ) ) - { - return; - } - - /*--------------------------------------------------------------------* - * skip IC-BWE in case of SID or NO_DATA frame - * -------------------------------------------------------------------*/ - - IF( LE_32( st->core_brate, SID_2k40 ) ) - { - return; - } - - /*--------------------------------------------------------------------* - * TD high band stereo filling * - * -------------------------------------------------------------------*/ - - /* update buffers for TD stereo filling */ - IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) - { - hb_nrg_fx = 0; - move32(); -#ifndef FIX_826_PRECISION_LOST_AND_COMPL - hb_nrg2_fx = 0; -#endif - move32(); - maximum_abs_32_fx( synthRef_fx, output_frame, &maxVal ); - synthRef_shift = norm_l( maxVal ); - if ( maxVal == 0 ) - { - synthRef_shift = 31; - move16(); - } -#ifndef FIX_826_PRECISION_LOST_AND_COMPL /* Not needed Q11 is already enough */ - synthRef_shift = sub( synthRef_shift, shr( add( find_guarded_bits_fx( output_frame ), 1 ), 1 ) ); -#else - synthRef_shift = sub( synthRef_shift, shr( add( find_guarded_bits_fx( shr( output_frame, 1 ) ), 1 ), 1 ) ); -#endif - test(); - IF( EQ_16( st->core, ACELP_CORE ) || EQ_16( st->last_core, ACELP_CORE ) ) - { -#ifdef FIX_826_PRECISION_LOST_AND_COMPL - Word64 W_tmp = 0; - move64(); - tmp = shl_sat( 1, synthRef_shift ); -#endif - FOR( i = 0; i < shr( output_frame, 1 ); i++ ) - { - // needed to be adjusted for q -#ifndef FIX_826_PRECISION_LOST_AND_COMPL - L_tmp = L_shl( synthRef_fx[i], synthRef_shift ); - hb_nrg2_fx = L_add( hb_nrg2_fx, Mpy_32_32( L_tmp, L_tmp ) ); // 2*(Qx + SynthRef_shift) - 31 -#else - L_tmp = Mpy_32_16_1( synthRef_fx[i], tmp ); - W_tmp = W_mac_32_32( W_tmp, L_tmp, L_tmp ); -#endif - } -#ifdef FIX_826_PRECISION_LOST_AND_COMPL - hb_nrg_fx = W_round48_L( W_tmp ); - hCPE->hStereoDft->hb_nrg_subr_fx[0] = hb_nrg_fx; - move32(); - hStereoDft->q_hb_nrg_subr = sub( shl( add( *Q_syn, synthRef_shift ), 1 ), 45 ); - move16(); - W_tmp = 0; - move64(); - FOR( ; i < output_frame; i++ ) - { - L_tmp = Mpy_32_16_1( synthRef_fx[i], tmp ); - W_tmp = W_mac_32_32( W_tmp, L_tmp, L_tmp ); - } - - hCPE->hStereoDft->hb_nrg_subr_fx[1] = W_round48_L( W_tmp ); // 2*(Qx + SynthRef_shift) - 45 - hb_nrg_fx = L_add( hCPE->hStereoDft->hb_nrg_subr_fx[0], hCPE->hStereoDft->hb_nrg_subr_fx[1] ); -#else - hCPE->hStereoDft->hb_nrg_subr_fx[0] = hb_nrg2_fx; - move32(); - hStereoDft->q_hb_nrg_subr = sub( add( *Q_syn, synthRef_shift ), 31 ); - hb_nrg_fx = L_add( hb_nrg_fx, hb_nrg2_fx ); - hb_nrg2_fx = 0; - move32(); - - FOR( ; i < output_frame; i++ ) - { - L_tmp = L_shl( synthRef_fx[i], synthRef_shift ); - hb_nrg2_fx = L_add( hb_nrg2_fx, Mpy_32_32( L_tmp, L_tmp ) ); - } - - hCPE->hStereoDft->hb_nrg_subr_fx[1] = hb_nrg2_fx; // 2*(Qx + SynthRef_shift) - 31 - move32(); - hb_nrg_fx = L_add( hb_nrg_fx, hb_nrg2_fx ); -#endif - - - Copy32( synthRef_fx, hCPE->hStereoDft->hb_stefi_sig_fx + hCPE->hStereoDft->hb_stefi_delay, output_frame ); -#ifndef FIX_826_PRECISION_LOST_AND_COMPL - Scale_sig32( hCPE->hStereoDft->hb_stefi_sig_fx + hCPE->hStereoDft->hb_stefi_delay, output_frame, -5 ); -#endif - } - ELSE - { - set32_fx( hCPE->hStereoDft->hb_stefi_sig_fx + hCPE->hStereoDft->hb_stefi_delay, 0, output_frame ); -#ifdef MSAN_FIX - hCPE->hStereoDft->hb_nrg_subr_fx[0] = 0; - move32(); - hCPE->hStereoDft->hb_nrg_subr_fx[1] = 0; - move32(); -#endif // MSAN_FIX - } - hCPE->hStereoDft->hb_nrg_subr_fx[0] = ( Mpy_32_16_1( hCPE->hStereoDft->hb_nrg_subr_fx[0], shl( hCPE->hStereoDft->NFFT / 2, 6 ) ) ); // 2 * (Qx + SynthRef_shift) - 40 // 2 * (Qx + SynthRef_shift) - 31 - 15 - move32(); - hCPE->hStereoDft->hb_nrg_subr_fx[1] = ( Mpy_32_16_1( hCPE->hStereoDft->hb_nrg_subr_fx[1], shl( hCPE->hStereoDft->NFFT / 2, 6 ) ) ); // 2 * (Qx + SynthRef_shift) - 40 - move32(); -#ifndef FIX_826_PRECISION_LOST_AND_COMPL - hCPE->hStereoDft->q_hb_nrg_subr = sub( shl( ( *Q_syn + synthRef_shift ), 1 ), 40 ); -#else - hCPE->hStereoDft->q_hb_nrg_subr = sub( shl( ( *Q_syn + synthRef_shift ), 1 ), 45 + 9 ); -#endif - hCPE->hStereoDft->hb_nrg_fx[0] = hb_nrg_fx; // 2 * (Qx + SynthRef_shift) - 31 - move32(); - hCPE->hStereoDft->td_gain_fx[0] = 0; - move32(); - hCPE->hStereoDft->core_hist[0] = st->core; - move16(); - } - - /*--------------------------------------------------------------------* - * IC-BWE * - * -------------------------------------------------------------------*/ - test(); - test(); - test(); - test(); - IF( st->core != ACELP_CORE || EQ_16( st->extl, -1 ) || ( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && NE_16( hCPE->hCoreCoder[0]->tdm_LRTD_flag, 0 ) ) ) - { - return; - } - ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && LE_32( st->core_brate, SID_2k40 ) ) - { - Copy32( synthRef_fx, synth_fx, output_frame ); - return; - } - - - set16_fx( fb_synth_nonref_fx, 0, L_FRAME48k ); - - /* core switching reset */ - test(); - IF( st->last_core != ACELP_CORE || EQ_16( st->bwidth, (Word16) WB ) ) - { - ic_bwe_dec_reset_fx( hStereoICBWE ); - - IF( st->last_core != ACELP_CORE ) - { - hStereoICBWE->prevSpecMapping_fx = 0; - move16(); - hStereoICBWE->prevgsMapping_fx = 16384; - move16(); - hStereoICBWE->icbweM2Ref_prev_fx = 16384; - move16(); - } - - IF( EQ_16( st->bwidth, WB ) ) - { - /* copy to outputHB and reset hb_synth values */ - Copy32( synthRef_fx, synth_fx, output_frame ); - - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) - { - hStereoICBWE->prevSpecMapping_fx = 0; - move16(); - hStereoICBWE->prevgsMapping_fx = 16384; - move16(); - hStereoICBWE->icbweM2Ref_prev_fx = 16384; - move16(); - } - ELSE IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) - { - hStereoICBWE->refChanIndx_bwe = L_CH_INDX; - move16(); - hStereoICBWE->prevSpecMapping_fx = 0; - move16(); - - prevgsMapping_fx = hStereoICBWE->prevgsMapping_fx; - move16(); - temp1_fx = shr( extract_h( hStereoDft->side_gain_fx[2 * STEREO_DFT_BAND_MAX + hStereoDft->nbands - 1] ), 1 ); - icbweM2Ref_fx = add( 16384, temp1_fx ); - gsMapping_fx = sub( 16384, temp1_fx ); - - winLen_fx = extract_l( Mpy_32_16_1( st->output_Fs, 41 ) ); //(int16_t)((SHB_OVERLAP_LEN * st->output_Fs) / 16000); - winSlope_fx = div_s( 1, winLen_fx ); - alpha_fx = winSlope_fx; - move16(); - FOR( i = 0; i < winLen_fx; i++ ) - { -#ifndef FIX_826_PRECISION_LOST_AND_COMPL - L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); // Q15 + Q14 - L_tmp = L_mac0( L_tmp, sub( 32767, alpha_fx ), ( hStereoICBWE->icbweM2Ref_prev_fx ) ); // Q15 + Q14; - tmp = shl( round_fx( L_tmp ), 1 ); // Q = 15 + 14 - 16 + 1 = Q14 - synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp ); - move32(); - L_tmp = L_mult0( alpha_fx, gsMapping_fx ); - L_tmp = L_mac0( L_tmp, ( sub( 32767, alpha_fx ) ), ( prevgsMapping_fx ) ); - tmp = shl( round_fx( L_tmp ), 1 ); // Q = 15 + 14 - 16 + 1 = Q14 - synth_fx[i] = Mpy_32_16_1( synth_fx[i], tmp ); - move32(); - IF( LE_16( alpha_fx, sub( 32767, winSlope_fx ) ) ) - { - alpha_fx = add( alpha_fx, winSlope_fx ); - } -#else - /*synthRef[i] *= ( alpha * ( icbweM2Ref ) + ( 1.0f - alpha ) * ( hStereoICBWE->icbweM2Ref_prev ) );*/ - temp1_fx = sub( 32767, alpha_fx ); - L_tmp = L_mult( alpha_fx, icbweM2Ref_fx ); // Q15 + Q14 + 1 - L_tmp = L_mac( L_tmp, temp1_fx, hStereoICBWE->icbweM2Ref_prev_fx ); // Q15 + Q14 +1 ; - synthRef_fx[i] = L_shl( Mpy_32_32( synthRef_fx[i], L_tmp ), 1 ); - move32(); - /*synth[i] *= ( alpha * ( gsMapping ) + ( 1.0f - alpha ) * ( prevgsMapping ) );*/ - L_tmp = L_mult( alpha_fx, gsMapping_fx ); - L_tmp = L_mac( L_tmp, temp1_fx, prevgsMapping_fx ); - synth_fx[i] = L_shl( Mpy_32_32( synth_fx[i], L_tmp ), 1 ); - move32(); - alpha_fx = add_sat( alpha_fx, winSlope_fx ); -#endif - } - FOR( ; i < NS2SA( st->output_Fs, FRAME_SIZE_NS ); i++ ) - { - synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], icbweM2Ref_fx ); - move32(); - synth_fx[i] = Mpy_32_16_1( synth_fx[i], gsMapping_fx ); - move32(); - } - hStereoICBWE->icbweM2Ref_prev_fx = icbweM2Ref_fx; - move16(); - hStereoICBWE->prevgsMapping_fx = gsMapping_fx; - move16(); - - *Q_syn = sub( *Q_syn, 1 ); - } - - return; - } - } - - IF( st->bfi == 0 ) - { - hStereoICBWE->refChanIndx_bwe = get_next_indice_fx( st, STEREO_ICBWE_REFBITS ); - IF( EQ_16( st->flag_ACELP16k, 1 ) ) - { - spIndx = get_next_indice_fx( st, STEREO_ICBWE_SPBITS ); - } - ELSE - { - spIndx = 3; - move16(); - } - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) - { - gsIndx = get_next_indice_fx( st, STEREO_ICBWE_GSBITS ); - } - ELSE - { - gsIndx = get_next_indice_fx( st, STEREO_ICBWE_GSBITS_DFT ); - } - - /* Store indices in case of frame loss */ - hStereoICBWE->prev_spIndx = spIndx; - move16(); - hStereoICBWE->prev_gsIndx = gsIndx; - move16(); - } - ELSE /*bfi*/ - { - /* Retrieve last decoded indices */ - spIndx = hStereoICBWE->prev_spIndx; - move16(); - gsIndx = hStereoICBWE->prev_gsIndx; - move16(); - hStereoICBWE->refChanIndx_bwe = hStereoICBWE->prev_refChanIndx_bwe; - move16(); - } - - /* IC-BWE parameter de-quant */ - /* sp Mapping */ - hStereoICBWE->prevSpecMapping_fx = usdequant_fx( spIndx, -19661, 3277 ); // Q15 - - /* gs Mapping */ - prevgsMapping_fx = hStereoICBWE->prevgsMapping_fx; // Q14 - move16(); - - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) - { - hStereoICBWE->prevgsMapping_fx = pow_10_icbwe_gsMapping_tbl_fx[gsIndx]; - move16(); - } - ELSE - { - hStereoICBWE->prevgsMapping_fx = pow_10_icbwe_gsMappingDFT_tbl_fx[gsIndx]; - move16(); - } - - // hStereoICBWE->prevgsMapping = powf( 10, hStereoICBWE->prevgsMapping ); - - specMapping_fx = hStereoICBWE->prevSpecMapping_fx; // Q15 - move16(); - gsMapping_fx = hStereoICBWE->prevgsMapping_fx; // Q14 - move16(); - - test(); - test(); - IF( ( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, FB_TBE ) ) && EQ_16( st->flag_ACELP16k, 1 ) ) - { - Copy( voice_factors_fx, nlMixFac_fx, NB_SUBFR16k ); // Q15 - IF( hCPE->hStereoDftDmx != NULL ) - { - test(); - IF( LT_32( hCPE->hStereoDftDmx->targetGain_fx, 268435456 ) || GT_32( hCPE->hStereoDftDmx->targetGain_fx, 1073741824 ) ) - { - v_multc_fixed_16_16( voice_factors_fx, 16384, nlMixFac_fx, NB_SUBFR16k ); - } - } - ELSE - { - test(); - IF( LT_32( hCPE->hStereoTCA->targetGain_fx, 268435456 ) || GT_32( hCPE->hStereoTCA->targetGain_fx, 1073741824 ) ) - { - v_multc_fixed_16_16( voice_factors_fx, 16384, nlMixFac_fx, NB_SUBFR16k ); - } - } - - // nbSubFr = ( st->flag_ACELP16k == 0 ) ? NB_SUBFR : NB_SUBFR16k; - IF( st->flag_ACELP16k == 0 ) - { - nbSubFr = NB_SUBFR; - move16(); - } - ELSE - { - nbSubFr = NB_SUBFR16k; - move16(); - } - k = 0; - move16(); - FOR( i = 0; i < nbSubFr; i++ ) - { - IF( EQ_16( hCPE->hCoreCoder[0]->coder_type, UNVOICED ) || EQ_16( hStereoICBWE->MSFlag, 1 ) ) - { - temp1_fx = 0; - move16(); - temp2_fx = 32767; - move16(); - } - ELSE - { - tmp = 0; - move16(); - temp1_fx = Sqrt16( nlMixFac_fx[i], &tmp ); - IF( LT_16( tmp, 0 ) ) - { - temp1_fx = shl( temp1_fx, tmp ); - } - tmp = 0; - move16(); - temp2_fx = Sqrt16( sub( 32767, nlMixFac_fx[i] ), &tmp ); - IF( LT_16( tmp, 0 ) ) - { - temp2_fx = shl( temp2_fx, tmp ); - } - } - - FOR( j = 0; j < L_FRAME16k / nbSubFr; j++ ) - { - // common Q for addition - L_nlExc16k = L_deposit_l( hStereoICBWE->nlExc16k_fx[k] ); // prev_q_bwe_exc - 16 - L_mixExc16k = L_deposit_l( hStereoICBWE->mixExc16k_fx[k] ); // Q_exc - L_nlExc16k = L_shl( L_nlExc16k, sub( Q_icBWE, ( sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // Q_icBWE -#ifndef FIX_736_BWE_SECT_C - L_mixExc16k = L_shl( L_mixExc16k, Q_icBWE - st->Q_exc ); // Q_icBWE -#else - L_mixExc16k = L_shl( L_mixExc16k, sub( Q_icBWE, ( sub( st->prev_Q_bwe_exc, 25 ) ) ) ); // Q_icBWE -#endif - excSHB_nonref_fx[k] = L_add( Mpy_32_16_1( L_nlExc16k, temp1_fx ), Mpy_32_16_1( L_mixExc16k, temp2_fx ) ); // Q_icBWE - move32(); - k++; - } - } - - /* LP synthesis */ - Q_syn_shb = 31; - move16(); - - Q_syn_shb = FindScale( hStereoICBWE->mem_syn_shb_nonref_fx, LPC_SHB_ORDER, hStereoICBWE->prev_Q_syn_shb_nonref, Q_syn_shb ); - Q_syn_shb = FindScale( hStereoICBWE->lpSHBRef_fx, LPC_SHB_ORDER + 1, 12, Q_syn_shb ); - Q_syn_shb = FindScale( excSHB_nonref_fx, L_FRAME16k, Q_icBWE, Q_syn_shb ); - Q_syn_shb = FindScale( hStereoICBWE->mem_lpc_shbsynth_nonref_fx, LPC_SHB_ORDER, hStereoICBWE->prev_Q_lpc_shbsynth_nonref, Q_syn_shb ); - - Q_syn_shb = sub( Q_syn_shb, 3 ); // gaurded bits - - Scale_sig32( hStereoICBWE->lpSHBRef_fx, LPC_SHB_ORDER + 1, sub( Q_syn_shb, 12 ) ); - Scale_sig32( excSHB_nonref_fx, L_FRAME16k, sub( Q_syn_shb, Q_icBWE ) ); - Scale_sig32( hStereoICBWE->mem_lpc_shbsynth_nonref_fx, LPC_SHB_ORDER, sub( Q_syn_shb, hStereoICBWE->prev_Q_lpc_shbsynth_nonref ) ); - Scale_sig32( hStereoICBWE->mem_syn_shb_nonref_fx, L_SHB_LAHEAD, sub( Q_syn_shb, hStereoICBWE->prev_Q_syn_shb_nonref ) ); - - - Copy32( hStereoICBWE->mem_syn_shb_nonref_fx, shb_synth_nonref_fx, L_SHB_LAHEAD ); - - E_UTIL_synthesis_fx( 0, hStereoICBWE->lpSHBRef_fx, excSHB_nonref_fx, shb_synth_nonref_fx + L_SHB_LAHEAD, L_FRAME16k, hStereoICBWE->mem_lpc_shbsynth_nonref_fx, 1, LPC_SHB_ORDER ); - - hStereoICBWE->prev_Q_lpc_shbsynth_nonref = Q_syn_shb; - move16(); - - maximum_abs_32_fx( shb_synth_nonref_fx, L_SHB_LAHEAD + 10 + L_SHB_LAHEAD + 10, &maxVal1 ); // Qsyn_shb - - shift_prev_pow = sub( norm_l( maxVal1 ), find_guarded_bits_fx( L_SHB_LAHEAD + 10 ) ); - - prev_pow_fx = 0; - move32(); - curr_pow_fx = 0; - move32(); - FOR( i = 0; i < L_SHB_LAHEAD + 10; i++ ) - { - L_tmp = L_shl( shb_synth_nonref_fx[i], shift_prev_pow ); - prev_pow_fx = L_add( prev_pow_fx, Mpy_32_32( L_tmp, L_tmp ) ); - } - FOR( i = 0; i < L_SHB_LAHEAD + 10; i++ ) - { - L_tmp = L_shl( shb_synth_nonref_fx[L_SHB_LAHEAD + 10 + i], shift_prev_pow ); - curr_pow_fx = L_add( curr_pow_fx, Mpy_32_32( L_tmp, L_tmp ) ); - } - - IF( EQ_32( prev_pow_fx, 0 ) ) - { - e_scale_fx = 0; - move16(); - scale_fx = 0; - move16(); - } - ELSE - { - e_scale_fx = 0; - move16(); - scale_fx = BASOP_Util_Divide3232_Scale( curr_pow_fx, prev_pow_fx, &e_scale_fx ); - scale_fx = Sqrt16( scale_fx, &e_scale_fx ); - } - IF( LT_16( e_scale_fx, 0 ) ) - { - scale_fx = shl( scale_fx, e_scale_fx ); - e_scale_fx = 0; - move16(); - } - FOR( i = 0; i < L_SHB_LAHEAD; i++ ) - { - shb_synth_nonref_fx[i] = Mpy_32_16_1( shb_synth_nonref_fx[i], scale_fx ); - move32(); - } - tmp = 3276; - move16(); - FOR( ; i < L_SHB_LAHEAD + 10; i++ ) - { - IF( EQ_16( e_scale_fx, 0 ) ) - { - temp1_fx = 32767; - move16(); - } - ELSE - { - temp1_fx = shl( 1, sub( 15, e_scale_fx ) ); - move16(); - } - L_tmp = L_mult0( tmp, temp1_fx ); - L_tmp = L_mac0( L_tmp, sub( 32767, tmp ), scale_fx ); - shb_synth_nonref_fx[i] = Mpy_32_16_1( shb_synth_nonref_fx[i], shl( round_fx( L_tmp ), 1 ) ); - move32(); - IF( LT_16( tmp, 29492 ) ) - { - tmp = add( tmp, 3276 ); - } - } - - /* spec and gs adjustment */ - Q_syn_shb = sub( Q_syn_shb, e_scale_fx ); - Scale_sig32( shb_synth_nonref_fx + L_SHB_LAHEAD + 10, L_FRAME16k - 10, -e_scale_fx ); - - tmp = 31; - move16(); - tmp = FindScale( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, Q_syn_shb, tmp ); - temp1_fx = norm_l( hStereoICBWE->memShbSpecMapping_fx ); - IF( EQ_32( hStereoICBWE->memShbSpecMapping_fx, 0 ) ) - { - temp1_fx = 31; - move16(); - } - temp1_fx = add( temp1_fx, hStereoICBWE->prev_Q_memshbspec ); - tmp = s_min( temp1_fx, tmp ); - - tmp = sub( tmp, 9 ); - - Scale_sig32( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, tmp - Q_syn_shb ); - hStereoICBWE->memShbSpecMapping_fx = L_shl( hStereoICBWE->memShbSpecMapping_fx, sub( tmp, hStereoICBWE->prev_Q_memshbspec ) ); - - hStereoICBWE->prev_Q_memshbspec = tmp; - move16(); - Q_syn_shb = tmp; - move16(); - - deemph_fx_32( 0, shb_synth_nonref_fx + L_SHB_LAHEAD, specMapping_fx, L_FRAME16k, &( hStereoICBWE->memShbSpecMapping_fx ) ); - hStereoICBWE->prev_Q_memshbspec = Q_syn_shb; - move16(); - Copy32( shb_synth_nonref_fx + L_FRAME16k, hStereoICBWE->mem_syn_shb_nonref_fx, L_SHB_LAHEAD ); - hStereoICBWE->prev_Q_syn_shb_nonref = Q_syn_shb; - move16(); - - tmp = 31; - move16(); - tmp = FindScale( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, Q_syn_shb, tmp ); - tmp = FindScale( hStereoICBWE->mem_syn_shb_ola_nonref_fx, L_SHB_LAHEAD, hStereoICBWE->prev_Q_syn_shb_ola_nonref, tmp ); - - tmp = sub( tmp, 3 ); - - Scale_sig32( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, tmp - Q_syn_shb ); - Scale_sig32( hStereoICBWE->mem_syn_shb_ola_nonref_fx, L_SHB_LAHEAD, tmp - hStereoICBWE->prev_Q_syn_shb_ola_nonref ); - - ScaleShapedSHB_32( SHB_OVERLAP_LEN, shb_synth_nonref_fx, hStereoICBWE->mem_syn_shb_ola_nonref_fx, hStereoICBWE->gshapeRef_fx, ( Mpy_32_16_1( L_shl( hStereoICBWE->gFrameRef_fx, 1 ), mult_r( gsMapping_fx, 29492 ) ) ), window_shb_fx, subwin_shb_fx, &tmp, &temp1_fx ); - - hStereoICBWE->prev_Q_syn_shb_ola_nonref = tmp; - move16(); - Q_syn_shb = tmp; - move16(); - - IF( EQ_16( st->extl, FB_TBE ) ) - { - v_multc_fixed_16_16( fb_synth_ref_fx, gsMapping_fx, fb_synth_nonref_fx, L_FRAME48k ); - } - - /* generate 32kHz SHB synthesis from 12.8(16)kHz signal */ - - tmp = 31; - move16(); - tmp = FindScale( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, Q_syn_shb, tmp ); - tmp = FindScale( hStereoICBWE->memShbHilbert_nonref_fx, HILBERT_MEM_SIZE, hStereoICBWE->prev_Q_hilb, tmp ); - tmp = FindScale( hStereoICBWE->memShbInterp_nonref_fx, 2 * ALLPASSSECTIONS_STEEP + 1, hStereoICBWE->prev_Q_interp, tmp ); - - tmp = sub( tmp, 3 ); - - Scale_sig32( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, sub( tmp, Q_syn_shb ) ); - Scale_sig32( hStereoICBWE->memShbHilbert_nonref_fx, HILBERT_MEM_SIZE, sub( tmp, hStereoICBWE->prev_Q_hilb ) ); - Scale_sig32( hStereoICBWE->memShbInterp_nonref_fx, 2 * ALLPASSSECTIONS_STEEP + 1, sub( tmp, hStereoICBWE->prev_Q_interp ) ); - - hStereoICBWE->prev_Q_hilb = tmp; - move16(); - hStereoICBWE->prev_Q_interp = tmp; - move16(); - - Q_syn_shb = tmp; - move16(); - - GenSHBSynth_fx_32( shb_synth_nonref_fx, error_fx, hStereoICBWE->memShbHilbert_nonref_fx, hStereoICBWE->memShbInterp_nonref_fx, st->L_frame, &( hStereoICBWE->syn_dm_phase_nonref ) ); - } - ELSE - { - Copy32( synthRef_fx, synth_fx, output_frame ); - - winLen_fx = extract_l( Mpy_32_16_1( st->output_Fs, 41 ) ); - winSlope_fx = div_s( 1, winLen_fx ); - alpha_fx = winSlope_fx; - move16(); - - - IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) - { - ratio_L_fx = 16384; - move16(); - } - ELSE - { - ratio_L_fx = extract_h( tdm_ratio_tabl_fx[hCPE->hStereoTD->tdm_last_ratio_idx] ); - move16(); - } - - icbweM2Ref_fx = gsMapping_fx; - move16(); - IF( hStereoICBWE->refChanIndx_bwe == L_CH_INDX ) - { - - IF( GE_16( ratio_L_fx, 3276 ) ) - { - tmp = mult_r( sub( 32767, ratio_L_fx ), sub( 32767, ratio_L_fx ) ); // Q15 - tmp = mult_r( tmp, gsMapping_fx ); // Q14 - tmp = mult_r( tmp, gsMapping_fx ); // Q13 - IF( LT_16( tmp, 4096 ) ) - { - temp1_fx = 0; - move16(); - temp2_fx = 0; - move16(); - tmp = shl( tmp, 2 ); - icbweM2Ref_fx = Sqrt16( sub( 16384, tmp ), &temp1_fx ); - icbweM2Ref_fx = BASOP_Util_Divide1616_Scale( icbweM2Ref_fx, ratio_L_fx, &temp2_fx ); - icbweM2Ref_fx = shl( icbweM2Ref_fx, add( temp2_fx, sub( temp1_fx, 1 ) ) ); // Q14 - } - ELSE - { - icbweM2Ref_fx = 0; - move16(); - } - } - } - ELSE - { - IF( LE_16( ratio_L_fx, 29490 ) ) - { -#ifdef FIX_TMP_714 - tmp = mult_r( ratio_L_fx, ratio_L_fx ); // Q15 -#else - tmp = mult_r( sub( 32767, ratio_L_fx ), sub( 32767, ratio_L_fx ) ); // Q15 -#endif - tmp = mult_r( tmp, gsMapping_fx ); // Q14 - tmp = mult_r( tmp, gsMapping_fx ); // Q13 - IF( LT_16( tmp, 4096 ) ) - { - temp1_fx = 0; - move16(); - temp2_fx = 0; - move16(); - tmp = shl( tmp, 2 ); - icbweM2Ref_fx = Sqrt16( sub( 16384, tmp ), &temp1_fx ); - icbweM2Ref_fx = BASOP_Util_Divide1616_Scale( icbweM2Ref_fx, sub( 32767, ratio_L_fx ), &temp2_fx ); - icbweM2Ref_fx = shl( icbweM2Ref_fx, add( temp2_fx, sub( temp1_fx, 1 ) ) ); // Q14 - } - ELSE - { - icbweM2Ref_fx = 0; - move16(); - } - } - } - - icbweM2Ref_fx = s_max( gsMapping_fx, icbweM2Ref_fx ); - - FOR( i = 0; i < winLen_fx; i++ ) - { - L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); - L_tmp = L_mac0( L_tmp, sub( 32767, alpha_fx ), hStereoICBWE->icbweM2Ref_prev_fx ); - tmp = shl( round_fx( L_tmp ), 1 ); - synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp ); - move32(); - L_tmp = L_mult0( alpha_fx, gsMapping_fx ); - L_tmp = L_mac0( L_tmp, sub( 32767, alpha_fx ), prevgsMapping_fx ); - tmp = shl( round_fx( L_tmp ), 1 ); - synth_fx[i] = Mpy_32_16_1( synth_fx[i], tmp ); - move32(); - IF( LE_16( alpha_fx, sub( 32767, winSlope_fx ) ) ) - { - alpha_fx = add( alpha_fx, winSlope_fx ); - } - } - FOR( ; i < NS2SA( st->output_Fs, FRAME_SIZE_NS ); i++ ) - { - synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], icbweM2Ref_fx ); - move32(); - synth_fx[i] = Mpy_32_16_1( synth_fx[i], gsMapping_fx ); - move32(); - } - hStereoICBWE->icbweM2Ref_prev_fx = icbweM2Ref_fx; - move16(); - - ic_bwe_dec_reset_fx( hStereoICBWE ); - hStereoICBWE->prevSpecMapping_fx = 0; - move16(); - - *Q_syn = sub( *Q_syn, 1 ); - - return; - } - - /* resample to output FS */ - - - IF( EQ_32( st->output_Fs, 48000 ) ) - { - tmp = 31; - move16(); - tmp = FindScale( error_fx, L_FRAME32k, Q_syn_shb, tmp ); - tmp = FindScale( hStereoICBWE->memShb_fsout_nonref_fx, INTERP_3_2_MEM_LEN, hStereoICBWE->prev_Q_fsout, tmp ); - tmp = sub( tmp, 4 ); - - Scale_sig32( error_fx, L_FRAME32k, sub( tmp, Q_syn_shb ) ); - Scale_sig32( hStereoICBWE->memShb_fsout_nonref_fx, INTERP_3_2_MEM_LEN, sub( tmp, hStereoICBWE->prev_Q_fsout ) ); - interpolate_3_over_2_allpass_32( error_fx, L_FRAME32k, synth_fx, hStereoICBWE->memShb_fsout_nonref_fx ); - hStereoICBWE->prev_Q_fsout = tmp; - move16(); - } - ELSE IF( EQ_32( st->output_Fs, 32000 ) ) - { - Copy32( error_fx, synth_fx, L_FRAME32k ); - } - ELSE IF( EQ_32( st->output_Fs, 16000 ) ) - { - tmp = 31; - move16(); - tmp = FindScale( error_fx, L_FRAME32k, Q_syn_shb, tmp ); - tmp = FindScale( hStereoICBWE->memShb_fsout_nonref_fx, INTERP_3_2_MEM_LEN, hStereoICBWE->prev_Q_fsout, tmp ); - tmp = sub( tmp, 4 ); - - Scale_sig32( error_fx, L_FRAME32k, sub( tmp, Q_syn_shb ) ); - Scale_sig32( hStereoICBWE->memShb_fsout_nonref_fx, INTERP_3_2_MEM_LEN, sub( tmp, hStereoICBWE->prev_Q_fsout ) ); - Decimate_allpass_steep_fx32( error_fx, hStereoICBWE->memShb_fsout_nonref_fx, L_FRAME32k, synth_fx ); - hStereoICBWE->prev_Q_fsout = tmp; - move16(); - } -#ifndef MSAN_FIX - Scale_sig32( synth_fx, L_FRAME48k, sub( *Q_syn, add( 1, tmp ) ) ); -#else - Scale_sig32( synth_fx, output_frame, sub( *Q_syn, add( 1, tmp ) ) ); -#endif - - *Q_syn = sub( *Q_syn, 1 ); - - test(); - IF( EQ_16( st->extl, FB_TBE ) && EQ_32( st->output_Fs, 48000 ) ) - { - - // v_add( fb_synth_nonref_fx, synth_fx, synth_fx, L_FRAME48k, 0 ); - FOR( i = 0; i < L_FRAME48k; i++ ) - { - synth_fx[i] = L_add( synth_fx[i], L_deposit_l( fb_synth_nonref_fx[i] ) ); - move32(); - } - } - - /* copy to outputHB and reset hb_synth values */ - - IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) - { - ratio_L_fx = 16384; - move16(); - } - ELSE - { - ratio_L_fx = extract_h( tdm_ratio_tabl_fx[hCPE->hStereoTD->tdm_last_ratio_idx] ); - move16(); - } - - icbweM2Ref_fx = gsMapping_fx; - move16(); - IF( hStereoICBWE->refChanIndx_bwe == L_CH_INDX ) - { - IF( GE_16( ratio_L_fx, 3276 ) ) - { - tmp = mult_r( sub( 32767, ratio_L_fx ), sub( 32767, ratio_L_fx ) ); // Q15 - tmp = mult_r( tmp, gsMapping_fx ); // Q14 - tmp = mult_r( tmp, gsMapping_fx ); // Q13 - IF( LT_16( tmp, 4096 ) ) - { - temp1_fx = 0; - move16(); - temp2_fx = 0; - move16(); - tmp = shl( tmp, 2 ); - icbweM2Ref_fx = Sqrt16( sub( 16384, tmp ), &temp1_fx ); - icbweM2Ref_fx = BASOP_Util_Divide1616_Scale( icbweM2Ref_fx, ratio_L_fx, &temp2_fx ); - icbweM2Ref_fx = shl( icbweM2Ref_fx, add( temp1_fx, sub( temp2_fx, 1 ) ) ); // Q14 - } - ELSE - { - icbweM2Ref_fx = 0; - move16(); - } - } - } - ELSE - { - IF( LE_16( ratio_L_fx, 29490 ) ) - { -#ifdef FIX_TMP_714 - tmp = mult_r( ratio_L_fx, ratio_L_fx ); // Q15 -#else - tmp = mult_r( sub( 32767, ratio_L_fx ), sub( 32767, ratio_L_fx ) ); // Q15 -#endif - tmp = mult_r( tmp, gsMapping_fx ); // Q14 - tmp = mult_r( tmp, gsMapping_fx ); // Q13 - IF( LT_16( tmp, 4096 ) ) - { - temp1_fx = 0; - move16(); - temp2_fx = 0; - move16(); - tmp = shl( tmp, 2 ); - icbweM2Ref_fx = Sqrt16( sub( 16384, tmp ), &temp1_fx ); - icbweM2Ref_fx = BASOP_Util_Divide1616_Scale( icbweM2Ref_fx, sub( 32767, ratio_L_fx ), &temp2_fx ); - icbweM2Ref_fx = shl( icbweM2Ref_fx, add( temp2_fx, sub( temp1_fx, 1 ) ) ); // Q14 - } - ELSE - { - icbweM2Ref_fx = 0; - move16(); - } - } - } - - icbweM2Ref_fx = s_max( gsMapping_fx, icbweM2Ref_fx ); - - winLen_fx = extract_l( Mpy_32_16_1( st->output_Fs, 41 ) ); - winSlope_fx = div_s( 1, winLen_fx ); - alpha_fx = winSlope_fx; - move16(); - FOR( i = 0; i < winLen_fx; i++ ) - { - L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); - L_tmp = L_mac0( L_tmp, sub( 32767, alpha_fx ), hStereoICBWE->icbweM2Ref_prev_fx ); - tmp = shl( round_fx( L_tmp ), 1 ); - synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp ); - move32(); - IF( LE_16( alpha_fx, sub( 32767, winSlope_fx ) ) ) - { - alpha_fx = add( alpha_fx, winSlope_fx ); - } - } - - FOR( ; i < NS2SA( st->output_Fs, FRAME_SIZE_NS ); i++ ) - { - synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], icbweM2Ref_fx ); - move32(); - } - - hStereoICBWE->icbweM2Ref_prev_fx = icbweM2Ref_fx; - move16(); - - return; -} -#endif - -/*-------------------------------------------------------------------* - * stereo_icBWE_decproc() - * - * Stereo (inter-channel) BWE mapping - decoder initialization - *-------------------------------------------------------------------*/ - -#ifndef IVAS_FLOAT_FIXED -void stereo_icBWE_decproc( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - float *output[CPE_CHANNELS], /* i/o: output synthesis */ - float outputHB[CPE_CHANNELS][L_FRAME48k], /* i : HB synthesis */ - const int16_t last_core, /* i : last core, primary channel */ - const int16_t last_bwidth, /* i : last bandwidth */ - const int16_t output_frame /* i : frame length */ -) -{ - int16_t i, j, n, decoderDelay, icbweOLASize, dftOvlLen; - int16_t core, memOffset, refChanIndx_bwe; - float temp0[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )], temp1[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )]; - float winSlope, alpha; - const float *win_dft; - int32_t extl_brate, output_Fs; - - STEREO_ICBWE_DEC_HANDLE hStereoICBWE = hCPE->hStereoICBWE; - - - /*--------------------------------------------------------------------* - * skip IC-BWE in case of SID or NO_DATA frame - * -------------------------------------------------------------------*/ - - if ( ( hCPE->element_mode == IVAS_CPE_TD || hCPE->element_mode == IVAS_CPE_DFT ) && hCPE->nchan_out == 2 /*&& hCPE->hCoreCoder[0]->core_brate > SID_2k40*/ && hCPE->hCoreCoder[0]->last_core_brate <= SID_2k40 ) - { - stereo_icBWE_init_dec( hCPE->hStereoICBWE ); - } - - if ( hCPE->hCoreCoder[0]->core_brate <= SID_2k40 ) - { - return; - } - - /*--------------------------------------------------------------------* - * skip IC-BWE in case of mono DMX output * - * -------------------------------------------------------------------*/ - - if ( hCPE->nchan_out == 1 && hCPE->element_mode == IVAS_CPE_DFT ) - { - add_HB_to_mono_dmx( hCPE, output[0], outputHB[0], last_core, output_frame ); - - return; - } - else if ( hCPE->nchan_out == 1 && hCPE->element_mode != IVAS_CPE_TD ) - { - return; - } - - /*--------------------------------------------------------------------* - * IC-BWE processing - * -------------------------------------------------------------------*/ - - core = hCPE->hCoreCoder[0]->core; - extl_brate = hCPE->hCoreCoder[0]->extl_brate; - output_Fs = hCPE->hCoreCoder[0]->output_Fs; - - memOffset = NS2SA( output_Fs, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); - - /* LRTD stereo mode - 2xBWEs used */ - if ( hCPE->element_mode == IVAS_CPE_TD && hCPE->hCoreCoder[0]->tdm_LRTD_flag ) - { - /* delay HB synth */ - for ( n = 0; n < CPE_CHANNELS; n++ ) - { - mvr2r( outputHB[n] + output_frame - memOffset, temp0, memOffset ); - mvr2r( outputHB[n], outputHB[n] + memOffset, output_frame - memOffset ); - mvr2r( hCPE->prev_hb_synth[n], outputHB[n], memOffset ); - mvr2r( temp0, hCPE->prev_hb_synth[n], memOffset ); - } - - if ( hCPE->nchan_out == 1 ) - { - /* stereo to mono downmix */ - for ( i = 0; i < output_frame; i++ ) - { - outputHB[0][i] = ( outputHB[0][i] + outputHB[1][i] ) * 0.5f; - } - v_add( output[0], outputHB[0], output[0], output_frame ); - } - else - { - /* Add the delayed hb_synth component to the delayed ACELP synthesis */ - for ( n = 0; n < CPE_CHANNELS; n++ ) - { - v_add( output[n], outputHB[n], output[n], output_frame ); - } - } - } - else - { - for ( n = 0; n < CPE_CHANNELS; n++ ) - { - set_f( hCPE->prev_hb_synth[n], 0, memOffset ); - } - } - - if ( hCPE->element_mode != IVAS_CPE_MDCT && !( hCPE->element_mode == IVAS_CPE_TD && hCPE->hCoreCoder[0]->tdm_LRTD_flag ) ) - { - if ( hCPE->last_element_mode == IVAS_CPE_MDCT ) - { - set_f( hStereoICBWE->memOutHB[0], 0, memOffset ); - set_f( hStereoICBWE->memOutHB[1], 0, memOffset ); - - set_f( hStereoICBWE->memTransitionHB[0], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); - set_f( hStereoICBWE->memTransitionHB[1], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); - } - - if ( core == ACELP_CORE && extl_brate > 0 ) - { - refChanIndx_bwe = hStereoICBWE->refChanIndx_bwe; - - if ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->hCoreCoder[0]->bwidth > WB && last_bwidth == WB && hCPE->hCoreCoder[0]->ini_frame > 1 /* counter wass already updated */ ) - { - /* fad-in reference HB signal */ - winSlope = ( memOffset > 0 ) ? ( 1.0f / memOffset ) : 0; - for ( i = 0; i < memOffset; i++ ) - { - outputHB[refChanIndx_bwe][i] *= ( i + 1 ) * winSlope; - } - } - /* Resampled LB and HB offset */ - mvr2r( outputHB[refChanIndx_bwe], temp0 + memOffset, output_frame - memOffset ); - mvr2r( outputHB[!refChanIndx_bwe], temp1 + memOffset, output_frame - memOffset ); - - decoderDelay = NS2SA( output_Fs, IVAS_DEC_DELAY_NS ); - - if ( last_core != ACELP_CORE && hCPE->element_mode == IVAS_CPE_DFT ) - { - /* hb_synth of mid band is faded out in the 1.25 ms prior to DFT analysis and the icbwe is faded in time domain */ - icbweOLASize = NS2SA( output_Fs, STEREO_DFT_DELAY_DEC_BWE_NS ); - - for ( i = 0; i < decoderDelay; i++ ) - { - temp0[i] = 0; - temp1[i] = 0; - } - - assert( icbweOLASize > 0 ); - winSlope = 1.0f / icbweOLASize; - alpha = winSlope; - for ( ; i < decoderDelay + icbweOLASize; i++ ) - { - temp0[i] *= alpha; - temp1[i] *= alpha; - alpha += winSlope; - } - } - else - { - if ( refChanIndx_bwe != hStereoICBWE->prev_refChanIndx_bwe ) - { - winSlope = ( memOffset > 0 ) ? ( 1.0f / memOffset ) : 0; - for ( i = 0; i < memOffset; i++ ) - { - temp0[i] = ( ( i + 1 ) * winSlope ) * hStereoICBWE->memOutHB[refChanIndx_bwe][i] + - ( 1 - ( i + 1 ) * winSlope ) * hStereoICBWE->memOutHB[hStereoICBWE->prev_refChanIndx_bwe][i]; - temp1[i] = ( ( i + 1 ) * winSlope ) * hStereoICBWE->memOutHB[hStereoICBWE->prev_refChanIndx_bwe][i] + - ( 1 - ( i + 1 ) * winSlope ) * hStereoICBWE->memOutHB[refChanIndx_bwe][i]; - } - } - else - { - mvr2r( hStereoICBWE->memOutHB[refChanIndx_bwe], temp0, memOffset ); - mvr2r( hStereoICBWE->memOutHB[!refChanIndx_bwe], temp1, memOffset ); - } - } - - if ( hCPE->nchan_out == 1 ) - { - /* stereo to mono downmix */ - for ( i = 0; i < output_frame; i++ ) - { - temp0[i] = ( temp0[i] + temp1[i] ) * 0.5f; - output[0][i] += temp0[i]; - } - } - else - { - - v_add( temp0, output[0], output[0], output_frame ); - v_add( temp1, output[1], output[1], output_frame ); - } - mvr2r( outputHB[0] + output_frame - memOffset, hStereoICBWE->memOutHB[0], memOffset ); - mvr2r( outputHB[1] + output_frame - memOffset, hStereoICBWE->memOutHB[1], memOffset ); - - if ( hCPE->element_mode == IVAS_CPE_DFT ) - { - win_dft = hCPE->hStereoDft->win32ms; - dftOvlLen = hCPE->hStereoDft->dft32ms_ovl; - - /* Preparing buffers in anticipation of an ACELP to TCX switch */ - j = 0; - for ( i = 0; i < memOffset; i++ ) - { - hStereoICBWE->memTransitionHB[0][i] = hStereoICBWE->memOutHB[0][i] * win_dft[STEREO_DFT32MS_STEP * ( dftOvlLen - 1 - j )]; - hStereoICBWE->memTransitionHB[1][i] = hStereoICBWE->memOutHB[1][i] * win_dft[STEREO_DFT32MS_STEP * ( dftOvlLen - 1 - j )]; - j++; - } - - for ( i = 0; j < dftOvlLen; i++ ) - { - hStereoICBWE->memTransitionHB[0][memOffset + i] = outputHB[0][output_frame - i - 1] * win_dft[STEREO_DFT32MS_STEP * ( dftOvlLen - 1 - j )]; - hStereoICBWE->memTransitionHB[1][memOffset + i] = outputHB[1][output_frame - i - 1] * win_dft[STEREO_DFT32MS_STEP * ( dftOvlLen - 1 - j )]; - j++; - } - } - - hStereoICBWE->prev_refChanIndx_bwe = refChanIndx_bwe; - } - else - { - if ( last_core == ACELP_CORE ) - { - if ( hCPE->element_mode == IVAS_CPE_TD ) - { - v_add( output[0], hStereoICBWE->memOutHB[hStereoICBWE->prev_refChanIndx_bwe], output[0], memOffset ); - v_add( output[1], hStereoICBWE->memOutHB[!hStereoICBWE->prev_refChanIndx_bwe], output[1], memOffset ); - } - else - { - /* This is generated in the ACELP frame and windowed. This process is akin to GenTransition for IC-BWE */ - v_add( output[0], hStereoICBWE->memTransitionHB[hStereoICBWE->prev_refChanIndx_bwe], output[0], NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); - v_add( output[1], hStereoICBWE->memTransitionHB[!hStereoICBWE->prev_refChanIndx_bwe], output[1], NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); - } - - set_f( hStereoICBWE->memOutHB[0], 0, memOffset ); - set_f( hStereoICBWE->memOutHB[1], 0, memOffset ); - - set_f( hStereoICBWE->memTransitionHB[0], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); - set_f( hStereoICBWE->memTransitionHB[1], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); - } - } - } - else if ( hCPE->element_mode == IVAS_CPE_TD && hCPE->hCoreCoder[0]->tdm_LRTD_flag && hStereoICBWE != NULL ) - { - stereo_icBWE_init_dec( hCPE->hStereoICBWE ); - } - else if ( hCPE->element_mode == IVAS_CPE_MDCT && hCPE->last_element_mode == IVAS_CPE_DFT && last_core == ACELP_CORE ) - { - int16_t delay_tdbwe = NS2SA( output_Fs, DELAY_BWE_TOTAL_NS ); - - for ( n = 0; n < hCPE->nchan_out; n++ ) - { - for ( i = 0; i < delay_tdbwe; i++ ) - { - output[n][NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) - delay_tdbwe + i] += outputHB[0][i]; - } - } - /* reset BWE structs as they are only needed in the transition frame in MDCT Stereo */ - td_bwe_dec_init( hCPE->hCoreCoder[0]->hBWE_TD, -1, output_Fs ); - - fd_bwe_dec_init_flt( hCPE->hCoreCoder[0]->hBWE_FD ); - } - - if ( hCPE->element_mode == IVAS_CPE_DFT && ( max( hCPE->hStereoDft->td_gain[0], hCPE->hStereoDft->td_gain[1] ) > 0 ) ) - { - float win_in, win_out, tmp; - - win_dft = hCPE->hStereoDft->win32ms; - dftOvlLen = hCPE->hStereoDft->dft32ms_ovl; - - for ( i = 0; i < dftOvlLen; i++ ) - { - win_in = win_dft[STEREO_DFT32MS_STEP * i] * win_dft[STEREO_DFT32MS_STEP * i]; - win_out = 1 - win_in; - tmp = ( win_in * hCPE->hStereoDft->td_gain[0] + win_out * hCPE->hStereoDft->td_gain[1] ) * hCPE->hStereoDft->hb_stefi_sig[i]; - - output[0][i] += tmp; - output[1][i] -= tmp; - } - for ( i = dftOvlLen; i < output_frame; i++ ) - { - tmp = hCPE->hStereoDft->td_gain[0] * hCPE->hStereoDft->hb_stefi_sig[i]; - output[0][i] += tmp; - output[1][i] -= tmp; - } - } - - return; -} -#else -void stereo_icBWE_decproc_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - Word32 *output[CPE_CHANNELS], /* i/o: output synthesis */ - Word32 outputHB[CPE_CHANNELS][L_FRAME48k], /* i : HB synthesis */ - const Word16 last_core, /* i : last core, primary channel */ - const Word16 last_bwidth, /* i : last bandwidth */ - const Word16 output_frame /* i : frame length */ -#ifndef FIX_826_PRECISION_LOST_AND_COMPL - , - Word16 q_output /* i : Q-fac of output */ -#endif -) -{ - Word16 i, j, n, decoderDelay, icbweOLASize, dftOvlLen; - Word16 core, memOffset, refChanIndx_bwe; - - Word32 temp0_fx[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )], temp1_fx[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )]; -#if defined FIX_826_PRECISION_LOST_AND_COMPL - Word16 winSlope_fx = 0, alpha_fx; -#else - Word32 winSlope_fx = 0, alpha_fx; -#endif - move32(); - const Word16 *win_dft_fx; - Word32 extl_brate, output_Fs; - - STEREO_ICBWE_DEC_HANDLE hStereoICBWE = hCPE->hStereoICBWE; - - /*--------------------------------------------------------------------* - * skip IC-BWE in case of SID or NO_DATA frame - * -------------------------------------------------------------------*/ - - test(); - test(); - test(); - IF( ( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) || EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) && EQ_16( hCPE->nchan_out, 2 ) /*&& hCPE->hCoreCoder[0]->core_brate > SID_2k40*/ && LE_32( hCPE->hCoreCoder[0]->last_core_brate, SID_2k40 ) ) - { - stereo_icBWE_init_dec_fx( hCPE->hStereoICBWE ); - } - - IF( LE_32( hCPE->hCoreCoder[0]->core_brate, SID_2k40 ) ) - { - return; - } - - /*--------------------------------------------------------------------* - * skip IC-BWE in case of mono DMX output * - * -------------------------------------------------------------------*/ - - test(); - test(); - IF( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) - { - add_HB_to_mono_dmx_fx( hCPE, output[0], outputHB[0], last_core, output_frame ); - return; - } - ELSE IF( EQ_16( hCPE->nchan_out, 1 ) && NE_16( hCPE->element_mode, IVAS_CPE_TD ) ) - { - return; - } - - /*--------------------------------------------------------------------* - * IC-BWE processing - * -------------------------------------------------------------------*/ - - core = hCPE->hCoreCoder[0]->core; - move16(); - extl_brate = hCPE->hCoreCoder[0]->extl_brate; - move32(); - output_Fs = hCPE->hCoreCoder[0]->output_Fs; - move32(); - - memOffset = NS2SA( output_Fs, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); - - /* LRTD stereo mode - 2xBWEs used */ - test(); - IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && hCPE->hCoreCoder[0]->tdm_LRTD_flag ) - { - /* delay HB synth */ - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - Copy32( outputHB[n] + output_frame - memOffset, temp0_fx, memOffset ); - Copy32( outputHB[n], outputHB[n] + memOffset, output_frame - memOffset ); - Copy32( hCPE->prev_hb_synth_fx[n], outputHB[n], memOffset ); - Copy32( temp0_fx, hCPE->prev_hb_synth_fx[n], memOffset ); - } - - IF( EQ_16( hCPE->nchan_out, 1 ) ) - { - /* stereo to mono downmix */ - FOR( i = 0; i < output_frame; i++ ) - { -#ifdef FIX_826_PRECISION_LOST_AND_COMPL - outputHB[0][i] = W_extract_h( W_mac_32_16( W_mult_32_16( outputHB[0][i], 16384 ), outputHB[1][i], 16384 ) ); -#else - outputHB[0][i] = L_shr( ( outputHB[0][i] + outputHB[1][i] ), 1 ); -#endif - move32(); - } - v_add_32( output[0], outputHB[0], output[0], output_frame ); - } - ELSE - { - /* Add the delayed hb_synth component to the delayed ACELP synthesis */ - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - v_add_32( output[n], outputHB[n], output[n], output_frame ); - } - } - } - ELSE - { - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - set32_fx( hCPE->prev_hb_synth_fx[n], 0, memOffset ); - } - } - - test(); - test(); - test(); - test(); - test(); - test(); - IF( NE_16( hCPE->element_mode, IVAS_CPE_MDCT ) && !( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && hCPE->hCoreCoder[0]->tdm_LRTD_flag ) ) - { - IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) ) - { - set32_fx( hStereoICBWE->memOutHB_fx[0], 0, memOffset ); - set32_fx( hStereoICBWE->memOutHB_fx[1], 0, memOffset ); - - set32_fx( hStereoICBWE->memTransitionHB_fx[0], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); - set32_fx( hStereoICBWE->memTransitionHB_fx[1], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); - } - - test(); - IF( EQ_16( core, ACELP_CORE ) && extl_brate > 0 ) - { - refChanIndx_bwe = hStereoICBWE->refChanIndx_bwe; - move16(); - - test(); - test(); - test(); - IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && GT_16( hCPE->hCoreCoder[0]->bwidth, WB ) && EQ_16( last_bwidth, WB ) && GT_16( hCPE->hCoreCoder[0]->ini_frame, 1 ) /* counter wass already updated */ ) - { - /* fad-in reference HB signal */ - IF( GT_16( memOffset, 0 ) ) - { - SWITCH( memOffset ) - { -#if defined FIX_826_PRECISION_LOST_AND_COMPL - case 15: - winSlope_fx = 2185; - move32(); - BREAK; - case 30: - winSlope_fx = 1092; - move32(); - BREAK; - case 45: - winSlope_fx = 728; - move32(); - BREAK; -#else - case 15: - winSlope_fx = 71582792; - move32(); - BREAK; - case 30: - winSlope_fx = 35791396; - move32(); - BREAK; - case 45: - winSlope_fx = 23860930; - move32(); - BREAK; -#endif - } - // memOffset for 16K 32K 48K are 15 30 45 respectively.camera - } - ELSE - { - winSlope_fx = 0; - move32(); - } -#if defined FIX_826_PRECISION_LOST_AND_COMPL - alpha_fx = 0; - move16(); -#endif - FOR( i = 0; i < memOffset; i++ ) - { -#if defined FIX_826_PRECISION_LOST_AND_COMPL - alpha_fx = add_sat( alpha_fx, winSlope_fx ); - outputHB[refChanIndx_bwe][i] = W_round48_L( W_mult_32_16( outputHB[refChanIndx_bwe][i] /* Q11 + Q15 + 1 - 16 = Q11)*/, winSlope_fx ) ); // -#else - Word32 mul_win = Mpy_32_16_1( winSlope_fx, ( i + 1 ) ); // Q30 + Q0 - 15 = Q15 - mul_win = L_shl( mul_win, 15 ); // Q30 - outputHB[refChanIndx_bwe][i] = L_shl( Mpy_32_32( outputHB[refChanIndx_bwe][i] /* Q11 + Q30 - 31 = Q10)*/, mul_win ), 1 ); // -#endif - move32(); - } - } - /* Resampled LB and HB offset */ - Copy32( outputHB[refChanIndx_bwe], temp0_fx + memOffset, sub( output_frame, memOffset ) ); - Copy32( outputHB[!refChanIndx_bwe], temp1_fx + memOffset, sub( output_frame, memOffset ) ); - - decoderDelay = NS2SA( output_Fs, IVAS_DEC_DELAY_NS ); - - test(); - IF( last_core != ACELP_CORE && EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) - { - /* hb_synth of mid band is faded out in the 1.25 ms prior to DFT analysis and the icbwe is faded in time domain */ - icbweOLASize = NS2SA( output_Fs, STEREO_DFT_DELAY_DEC_BWE_NS ); - - FOR( i = 0; i < decoderDelay; i++ ) - { - temp0_fx[i] = 0; - move32(); - temp1_fx[i] = 0; - move32(); - } - - assert( icbweOLASize > 0 ); - SWITCH( icbweOLASize ) - { -#if defined FIX_826_PRECISION_LOST_AND_COMPL - case 60: - winSlope_fx = 546; - move16(); - BREAK; - case 40: - winSlope_fx = 819; - move16(); - BREAK; - case 20: - winSlope_fx = 1638; - move16(); - BREAK; - default: - fprintf( stderr, "icbweOLASize of size %d not implemented \n", icbweOLASize ); - assert( 0 ); - BREAK; -#else - case 60: - winSlope_fx = 17895698; - move32(); - BREAK; - case 40: - winSlope_fx = 26843546; - move32(); - BREAK; - case 20: - winSlope_fx = 53687092; - move32(); - BREAK; -#endif - } - alpha_fx = winSlope_fx; // Q30 - move32(); - FOR( ; i < add( decoderDelay, icbweOLASize ); i++ ) - { -#if defined FIX_826_PRECISION_LOST_AND_COMPL - temp0_fx[i] = W_round48_L( W_mult_32_16( temp0_fx[i], alpha_fx ) ); // Q11 - move32(); - temp1_fx[i] = W_round48_L( W_mult_32_16( temp1_fx[i], alpha_fx ) ); - move32(); - alpha_fx = add_sat( alpha_fx, winSlope_fx ); -#else - temp0_fx[i] = L_shl_sat( Mpy_32_32( temp0_fx[i], alpha_fx ), 1 ); // Q11 - move32(); - temp1_fx[i] = L_shl_sat( Mpy_32_32( temp1_fx[i], alpha_fx ), 1 ); - move32(); - alpha_fx = L_add( alpha_fx, winSlope_fx ); -#endif - } - } - ELSE - { - IF( NE_16( refChanIndx_bwe, hStereoICBWE->prev_refChanIndx_bwe ) ) - { - IF( memOffset > 0 ) - { - SWITCH( memOffset ) - { -#if defined FIX_826_PRECISION_LOST_AND_COMPL - case 15: - winSlope_fx = 2185; - move16(); - BREAK; - case 30: - winSlope_fx = 1092; - move16(); - BREAK; - case 45: - winSlope_fx = 728; - move16(); - BREAK; -#else - case 15: - winSlope_fx = 71582792; - move32(); - BREAK; - case 30: - winSlope_fx = 35791396; - move32(); - BREAK; - case 45: - winSlope_fx = 23860930; // Q30 - move32(); - BREAK; -#endif - } - // memOffset for 16K 32K 48K are 15 30 45 respectively.camera - } - ELSE - { - winSlope_fx = 0; - move32(); - } -#if defined FIX_826_PRECISION_LOST_AND_COMPL - Word16 Incr = 0; - Word16 Decr = MAX_16; -#endif - move16(); - move16(); - FOR( i = 0; i < memOffset; i++ ) - { -#ifndef FIX_826_PRECISION_LOST_AND_COMPL - temp0_fx[i] = L_add( L_shl( Mpy_32_32( Mpy_32_16_1( winSlope_fx, ( i + 1 ) ), hStereoICBWE->memOutHB_fx[refChanIndx_bwe][i] ), 16 ), - L_shl( Mpy_32_32( Mpy_32_16_1( winSlope_fx, 1 - ( i + 1 ) ), hStereoICBWE->memOutHB_fx[hStereoICBWE->prev_refChanIndx_bwe][i] ), 16 ) ); - move32(); - - temp1_fx[i] = L_add( L_shl( Mpy_32_32( Mpy_32_16_1( winSlope_fx, ( i + 1 ) ), hStereoICBWE->memOutHB_fx[hStereoICBWE->prev_refChanIndx_bwe][i] ), 16 ), - L_shl( Mpy_32_32( Mpy_32_16_1( winSlope_fx, ( 1 - ( i + 1 ) ) ), hStereoICBWE->memOutHB_fx[refChanIndx_bwe][i] ), 16 ) ); -#else - Incr = add_sat( Incr, winSlope_fx ); - Decr = sub( Decr, winSlope_fx ); - temp0_fx[i] = W_round48_L( W_mac_32_16( W_mult_32_16( hStereoICBWE->memOutHB_fx[refChanIndx_bwe][i], Incr ), hStereoICBWE->memOutHB_fx[hStereoICBWE->prev_refChanIndx_bwe][i], Decr ) ); - temp1_fx[i] = W_round48_L( W_mac_32_16( W_mult_32_16( hStereoICBWE->memOutHB_fx[hStereoICBWE->prev_refChanIndx_bwe][i], Incr ), hStereoICBWE->memOutHB_fx[refChanIndx_bwe][i], Decr ) ); -#endif - move32(); - } - } - ELSE - { - Copy32( hStereoICBWE->memOutHB_fx[refChanIndx_bwe], temp0_fx, memOffset ); - Copy32( hStereoICBWE->memOutHB_fx[!refChanIndx_bwe], temp1_fx, memOffset ); - } - } - - IF( EQ_16( hCPE->nchan_out, 1 ) ) - { -#ifdef FIX_826_PRECISION_LOST_AND_COMPL - Word64 W_tmp; -#endif - /* stereo to mono downmix */ - FOR( i = 0; i < output_frame; i++ ) - { -#ifndef FIX_826_PRECISION_LOST_AND_COMPL - temp0_fx[i] = L_add( temp0_fx[i], temp1_fx[i] ); - move32(); - temp0_fx[i] = L_shr( temp0_fx[i], 1 ); - move32(); - output[0][i] = L_add( output[0][i], temp0_fx[i] ); -#else - W_tmp = W_mult_32_16( output[0][i], 32767 ); - W_tmp = W_mac_32_16( W_tmp, temp0_fx[i], 16384 ); - output[0][i] = W_round48_L( W_mac_32_16( W_tmp, temp1_fx[i], 16384 ) ); - move32(); - -#endif - move32(); - } - } - ELSE - { - v_add_32( temp0_fx, output[0], output[0], output_frame ); - v_add_32( temp1_fx, output[1], output[1], output_frame ); - } - - Copy32( outputHB[0] + output_frame - memOffset, hStereoICBWE->memOutHB_fx[0], memOffset ); - Copy32( outputHB[1] + output_frame - memOffset, hStereoICBWE->memOutHB_fx[1], memOffset ); - - IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) - { - /*win_dft = hCPE->hStereoDft->win32ms;*/ - win_dft_fx = hCPE->hStereoDft->win32ms_fx; - dftOvlLen = hCPE->hStereoDft->dft32ms_ovl; - move16(); - - /* Preparing buffers in anticipation of an ACELP to TCX switch */ - -#ifndef FIX_826_PRECISION_LOST_AND_COMPL - j = 0; - move16(); -#else - j = sub( dftOvlLen, 1 ); -#endif - FOR( i = 0; i < memOffset; i++ ) - { -#ifndef FIX_826_PRECISION_LOST_AND_COMPL - Word16 tmp_mul = mult0( STEREO_DFT32MS_STEP, ( sub( dftOvlLen, add( 1, j ) ) ) ); - hStereoICBWE->memTransitionHB_fx[0][i] = Mpy_32_16_1( hStereoICBWE->memOutHB_fx[0][i], win_dft_fx[tmp_mul] ); - move32(); - hStereoICBWE->memTransitionHB_fx[1][i] = Mpy_32_16_1( hStereoICBWE->memOutHB_fx[1][i], win_dft_fx[tmp_mul] ); - move32(); - j = add( j, 1 ); -#else - Word16 tmp_mul = i_mult( STEREO_DFT32MS_STEP, j ); - hStereoICBWE->memTransitionHB_fx[0][i] = Mpy_32_16_1( hStereoICBWE->memOutHB_fx[0][i], win_dft_fx[tmp_mul] ); - move32(); - hStereoICBWE->memTransitionHB_fx[1][i] = Mpy_32_16_1( hStereoICBWE->memOutHB_fx[1][i], win_dft_fx[tmp_mul] ); - move32(); - j = sub( j, 1 ); -#endif - } - -#ifndef FIX_826_PRECISION_LOST_AND_COMPL - FOR( i = 0; j < dftOvlLen; i++ ) -#else - FOR( i = 0; i < dftOvlLen; i++ ) -#endif - { -#ifndef FIX_826_PRECISION_LOST_AND_COMPL - Word16 tmp_mul = mult0( STEREO_DFT32MS_STEP, ( sub( dftOvlLen, add( 1, j ) ) ) ); - hStereoICBWE->memTransitionHB_fx[0][memOffset + i] = Mpy_32_16_1( outputHB[0][output_frame - i - 1], win_dft_fx[tmp_mul] ); - move32(); - hStereoICBWE->memTransitionHB_fx[1][memOffset + i] = Mpy_32_16_1( outputHB[1][output_frame - i - 1], win_dft_fx[tmp_mul] ); - move32(); - j = add( j, 1 ); -#else - Word16 tmp_mul = i_mult( STEREO_DFT32MS_STEP, j ); - hStereoICBWE->memTransitionHB_fx[0][memOffset + i] = Mpy_32_16_1( outputHB[0][output_frame - i - 1], win_dft_fx[tmp_mul] ); - move32(); - hStereoICBWE->memTransitionHB_fx[1][memOffset + i] = Mpy_32_16_1( outputHB[1][output_frame - i - 1], win_dft_fx[tmp_mul] ); - move32(); - j = sub( j, 1 ); -#endif - } - } - - hStereoICBWE->prev_refChanIndx_bwe = refChanIndx_bwe; - move16(); - } - ELSE - { - IF( last_core == ACELP_CORE ) - { - IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) ) - { - v_add_32( output[0], hStereoICBWE->memOutHB_fx[hStereoICBWE->prev_refChanIndx_bwe], output[0], memOffset ); - v_add_32( output[1], hStereoICBWE->memOutHB_fx[!hStereoICBWE->prev_refChanIndx_bwe], output[1], memOffset ); - } - ELSE - { - /* This is generated in the ACELP frame and windowed. This process is akin to GenTransition for IC-BWE */ - v_add_32( output[0], hStereoICBWE->memTransitionHB_fx[hStereoICBWE->prev_refChanIndx_bwe], output[0], NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); - v_add_32( output[1], hStereoICBWE->memTransitionHB_fx[!hStereoICBWE->prev_refChanIndx_bwe], output[1], NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); - } - - set32_fx( hStereoICBWE->memOutHB_fx[0], 0, memOffset ); - set32_fx( hStereoICBWE->memOutHB_fx[1], 0, memOffset ); - - set32_fx( hStereoICBWE->memTransitionHB_fx[0], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); - set32_fx( hStereoICBWE->memTransitionHB_fx[1], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); - } - } - } - ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && hCPE->hCoreCoder[0]->tdm_LRTD_flag && hStereoICBWE != NULL ) - { - stereo_icBWE_init_dec_fx( hCPE->hStereoICBWE ); - } - ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) && EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) && EQ_16( last_core, ACELP_CORE ) ) - { - Word16 delay_tdbwe = NS2SA( output_Fs, DELAY_BWE_TOTAL_NS ); - - FOR( n = 0; n < hCPE->nchan_out; n++ ) - { - FOR( i = 0; i < delay_tdbwe; i++ ) - { - output[n][NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) - delay_tdbwe + i] = L_add_sat( output[n][NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) - delay_tdbwe + i], outputHB[0][i] ); - move32(); - } - } - /* reset BWE structs as they are only needed in the transition frame in MDCT Stereo */ - td_bwe_dec_init_ivas_fx( hCPE->hCoreCoder[0], hCPE->hCoreCoder[0]->hBWE_TD, output_Fs ); - fd_bwe_dec_init( hCPE->hCoreCoder[0], hCPE->hCoreCoder[0]->hBWE_FD ); - } - - test(); - IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && GT_32( L_max( hCPE->hStereoDft->td_gain_fx[0], hCPE->hStereoDft->td_gain_fx[1] ), 0 ) ) - { -#ifdef FIX_826_PRECISION_LOST_AND_COMPL - Word32 win_in_fx, win_out_fx, tmp_fx; - Word64 W_tmp, W_tmp1; -#else - Word32 win_in_fx, win_out_fx, tmp_fx, gain0_fx, gain1_fx; -#endif - win_dft_fx = hCPE->hStereoDft->win32ms_fx; - dftOvlLen = hCPE->hStereoDft->dft32ms_ovl; - move16(); - - // Scale_sig32(hCPE->hStereoDft->td_gain_fx, STEREO_DFT_CORE_HIST_MAX, -12); - - FOR( i = 0; i < dftOvlLen; i++ ) - { -#ifdef FIX_826_PRECISION_LOST_AND_COMPL - j = i_mult( STEREO_DFT32MS_STEP, i ); - win_in_fx = L_mult( win_dft_fx[j], win_dft_fx[j] ); /* Q31 */ - win_out_fx = L_sub( ONE_IN_Q31, win_in_fx ); /* Q31 */ - /* hCPE->hStereoDft->q_hb_stefi_sig_fx is always 31 here */ - /* tmp = ( win_in * hCPE->hStereoDft->td_gain[0] + win_out * hCPE->hStereoDft->td_gain[1] ) * hCPE->hStereoDft->hb_stefi_sig[i]; */ - - W_tmp = W_mult_32_32( hCPE->hStereoDft->td_gain_fx[0], win_in_fx ); - if ( hCPE->hStereoDft->q_td_gain[0] != 0 ) - { - W_tmp = W_shl( W_tmp, sub( 31, hCPE->hStereoDft->q_td_gain[0] ) ); - } - W_tmp1 = W_mult_32_32( hCPE->hStereoDft->td_gain_fx[1], win_out_fx ); - if ( hCPE->hStereoDft->q_td_gain[1] != 0 ) - { - W_tmp1 = W_shl( W_tmp1, sub( 31, hCPE->hStereoDft->q_td_gain[1] ) ); - } - tmp_fx = W_extract_h( W_add_nosat( W_tmp, W_tmp1 ) ); - tmp_fx = W_extract_h( W_mult_32_32( tmp_fx, hCPE->hStereoDft->hb_stefi_sig_fx[i] ) ); - - output[0][i] = L_add_sat( output[0][i], tmp_fx ); - move32(); - output[1][i] = L_sub_sat( output[1][i], tmp_fx ); - move32(); -#else - win_in_fx = L_mult( win_dft_fx[mult0( STEREO_DFT32MS_STEP, i )], win_dft_fx[mult0( STEREO_DFT32MS_STEP, i )] ); /* Q31 */ - win_out_fx = L_sub( ONE_IN_Q31, win_in_fx ); /* Q31 */ - - gain0_fx = Mpy_32_32( win_in_fx, hCPE->hStereoDft->td_gain_fx[0] ); /* Q --> q_td_gain[0] */ -#ifdef FIX_736_BWE_SECT_C - gain0_fx = (Word32) W_shr( ( (Word64) gain0_fx * hCPE->hStereoDft->hb_stefi_sig_fx[i] ), sub( add( (Word16) hCPE->hStereoDft->q_td_gain[0], hCPE->hStereoDft->q_hb_stefi_sig_fx ), 2 * q_output + 14 ) ); /* Q --> q_output */ - gain1_fx = Mpy_32_32( win_out_fx, hCPE->hStereoDft->td_gain_fx[1] ); /* Q --> q_td_gain[1] */ - gain1_fx = (Word32) W_shr( ( (Word64) gain1_fx * hCPE->hStereoDft->hb_stefi_sig_fx[i] ), sub( add( (Word16) hCPE->hStereoDft->q_td_gain[1], hCPE->hStereoDft->q_hb_stefi_sig_fx ), 2 * q_output + 14 ) ); /* Q --> q_output */ -#else - gain0_fx = (Word32) W_shr( ( (Word64) gain0_fx * hCPE->hStereoDft->hb_stefi_sig_fx[i] ), sub( add( (Word16) hCPE->hStereoDft->q_td_gain[0], hCPE->hStereoDft->q_hb_stefi_sig_fx ), q_output ) ); /* Q --> q_output */ - gain1_fx = Mpy_32_32( win_out_fx, hCPE->hStereoDft->td_gain_fx[1] ); /* Q --> q_td_gain[1] */ - gain1_fx = (Word32) W_shr( ( (Word64) gain1_fx * hCPE->hStereoDft->hb_stefi_sig_fx[i] ), sub( add( (Word16) hCPE->hStereoDft->q_td_gain[1], hCPE->hStereoDft->q_hb_stefi_sig_fx ), q_output ) ); /* Q --> q_output */ -#endif - tmp_fx = L_add_sat( gain0_fx, gain1_fx ); /* Q --> q_output */ - - output[0][i] = L_add_sat( output[0][i], tmp_fx ); - move32(); - output[1][i] = L_sub_sat( output[1][i], tmp_fx ); - move32(); -#endif - } - FOR( i = dftOvlLen; i < output_frame; i++ ) - { -#ifdef FIX_826_PRECISION_LOST_AND_COMPL - tmp_fx = W_extract_h( W_mult_32_32( hCPE->hStereoDft->td_gain_fx[0], hCPE->hStereoDft->hb_stefi_sig_fx[i] ) ); /* Q11 --> Q11 */ -#else -#ifdef FIX_736_BWE_SECT_C - tmp_fx = (Word32) W_shr( ( (Word64) hCPE->hStereoDft->td_gain_fx[0] * hCPE->hStereoDft->hb_stefi_sig_fx[i] ), sub( add( (Word16) hCPE->hStereoDft->q_td_gain[0], hCPE->hStereoDft->q_hb_stefi_sig_fx ), 2 * q_output + 14 ) ); /* Q --> q_output */ -#else - tmp_fx = (Word32) W_shr( ( (Word64) hCPE->hStereoDft->td_gain_fx[0] * hCPE->hStereoDft->hb_stefi_sig_fx[i] ), sub( add( (Word16) hCPE->hStereoDft->q_td_gain[0], hCPE->hStereoDft->q_hb_stefi_sig_fx ), q_output ) ); /* Q --> q_output */ -#endif -#endif - output[0][i] = L_add_sat( output[0][i], tmp_fx ); - move32(); - output[1][i] = L_sub_sat( output[1][i], tmp_fx ); - move32(); - } - } - - return; -} -#endif - -/*-------------------------------------------------------------------* - * stereo_icBWE_init_dec() - * - * Stereo (inter-channel) BWE mapping - decoder initialization - *-------------------------------------------------------------------*/ - -#ifndef IVAS_FLOAT_FIXED -void stereo_icBWE_init_dec( - STEREO_ICBWE_DEC_HANDLE hStereoICBWE /* i/o: Stereo inter-channel BWE handle */ -) -{ - /* BWE ref channel */ - hStereoICBWE->refChanIndx_bwe = L_CH_INDX; - hStereoICBWE->prev_refChanIndx_bwe = L_CH_INDX; - - /* SHB output memory */ - set_f( hStereoICBWE->memOutHB[0], 0, NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) ); - set_f( hStereoICBWE->memOutHB[1], 0, NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) ); - - - /* SHB output memory */ - set_f( hStereoICBWE->memTransitionHB[0], 0, NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) ); - set_f( hStereoICBWE->memTransitionHB[1], 0, NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) ); - - /* inter-channel BWE spectral shape adj. */ - hStereoICBWE->prevSpecMapping = 0; - hStereoICBWE->prevgsMapping = 1.0f; - - hStereoICBWE->icbweM2Ref_prev = 1.0f; - - hStereoICBWE->prev_spIndx = 0; - hStereoICBWE->prev_gsIndx = 0; - - ic_bwe_dec_reset( hStereoICBWE ); - return; -} -#else -void stereo_icBWE_init_dec_fx( - STEREO_ICBWE_DEC_HANDLE hStereoICBWE /* i/o: Stereo inter-channel BWE handle */ -) -{ - /* BWE ref channel */ - hStereoICBWE->refChanIndx_bwe = L_CH_INDX; - move16(); - hStereoICBWE->prev_refChanIndx_bwe = L_CH_INDX; - move16(); - - /* SHB output memory */ - set32_fx( hStereoICBWE->memOutHB_fx[0], 0, NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) ); - set32_fx( hStereoICBWE->memOutHB_fx[1], 0, NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) ); - - - /* SHB output memory */ - set32_fx( hStereoICBWE->memTransitionHB_fx[0], 0, NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) ); - set32_fx( hStereoICBWE->memTransitionHB_fx[1], 0, NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) ); - - /* inter-channel BWE spectral shape adj. */ - hStereoICBWE->prevSpecMapping_fx = 0; - move16(); - hStereoICBWE->prevgsMapping_fx = 16384; - move16(); - hStereoICBWE->icbweM2Ref_prev_fx = 16384; - move16(); - - hStereoICBWE->prev_spIndx = 0; - move16(); - hStereoICBWE->prev_gsIndx = 0; - move16(); - - ic_bwe_dec_reset_fx( hStereoICBWE ); - - return; -} -#endif +/****************************************************************************************************** + + (C) 2022-2024 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "ivas_cnst.h" +#include "prot.h" +#include "prot_fx.h" +#include "ivas_prot.h" +#include "ivas_prot_fx.h" +#include "wmc_auto.h" +#include "rom_com.h" +#include "ivas_rom_com.h" +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif + + +#define Q_icBWE 16 + +/*-------------------------------------------------------------------* + * ic_bwe_dec_reset() + * + * core switching reset of IC BWE memory + *-------------------------------------------------------------------*/ + +#ifndef IVAS_FLOAT_FIXED +static void ic_bwe_dec_reset( + STEREO_ICBWE_DEC_HANDLE hStereoICBWE /* i/o: Stereo ICBWE handle */ +) +{ + /* unscaled & scaled SHB synthesis memory */ + set_f( hStereoICBWE->mem_syn_shb_nonref, 0, L_SHB_LAHEAD ); /* use samples from !acelp) */ + set_f( hStereoICBWE->mem_lpc_shbsynth_nonref, 0, LPC_SHB_ORDER ); + set_f( hStereoICBWE->mem_syn_shb_ola_nonref, 0, L_SHB_LAHEAD ); /* use samples from !acelp) */ + + /* inter-channel BWE SP and GSP mem reset */ + hStereoICBWE->memShbSpecMapping = 0; + + set_f( hStereoICBWE->memShbHilbert_nonref, 0, HILBERT_MEM_SIZE ); + set_f( hStereoICBWE->memShbInterp_nonref, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + set_f( hStereoICBWE->memShb_fsout_nonref, 0, INTERP_3_2_MEM_LEN ); + hStereoICBWE->syn_dm_phase_nonref = 0; + + return; +} +#else +static void ic_bwe_dec_reset_fx( + STEREO_ICBWE_DEC_HANDLE hStereoICBWE /* i/o: Stereo ICBWE handle */ +) +{ + /* unscaled & scaled SHB synthesis memory */ + set32_fx( hStereoICBWE->mem_syn_shb_nonref_fx, 0, L_SHB_LAHEAD ); /* use samples from !acelp) */ + set32_fx( hStereoICBWE->mem_lpc_shbsynth_nonref_fx, 0, LPC_SHB_ORDER ); + set32_fx( hStereoICBWE->mem_syn_shb_ola_nonref_fx, 0, L_SHB_LAHEAD ); /* use samples from !acelp) */ + + hStereoICBWE->prev_Q_syn_shb_nonref = 31; + move16(); + hStereoICBWE->prev_Q_lpc_shbsynth_nonref = 31; + move16(); + hStereoICBWE->prev_Q_syn_shb_ola_nonref = 31; + move16(); + + /* inter-channel BWE SP and GSP mem reset */ + hStereoICBWE->memShbSpecMapping_fx = 0; + move32(); + hStereoICBWE->prev_Q_memshbspec = 31; + move16(); + + set32_fx( hStereoICBWE->memShbHilbert_nonref_fx, 0, HILBERT_MEM_SIZE ); + set32_fx( hStereoICBWE->memShbInterp_nonref_fx, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + set32_fx( hStereoICBWE->memShb_fsout_nonref_fx, 0, INTERP_3_2_MEM_LEN ); + + hStereoICBWE->prev_Q_hilb = 31; + move16(); + hStereoICBWE->prev_Q_interp = 31; + move16(); + hStereoICBWE->prev_Q_fsout = 31; + move16(); + + hStereoICBWE->syn_dm_phase_nonref = 0; + move16(); + + return; +} +#endif + + +#ifndef IVAS_FLOAT_FIXED +/*-------------------------------------------------------------------* + * stereo_icBWE_dec() + * + * Spatial mapping of reference to the non-reference channels in SHB + *-------------------------------------------------------------------*/ + +void stereo_icBWE_dec( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float *synthRef, /* i/o: Reference channel HB synthesis at output Fs */ + float *synth, /* o : Non reference channel HB synthesis at output Fs */ + const float *fb_synth_ref, /* i : ref. high-band synthesis 16-20 kHz */ + const float *voice_factors, /* i : voicing factors */ + const int16_t output_frame /* i : frame length */ +) +{ + int16_t i, j, k, nbSubFr; + Decoder_State *st; /* i/o: decoder state structure, primary channel */ + int16_t spIndx, gsIndx; + float excSHB_nonref[L_FRAME16k]; + float shb_synth_nonref[L_FRAME16k + L_SHB_LAHEAD]; + float error[L_FRAME32k]; + float nlMixFac[NB_SUBFR16k]; + float gsMapping, specMapping; + float fb_synth_nonref[L_FRAME48k]; + float scale, prev_pow, curr_pow, temp; + float alpha, winSlope, winLen, prevgsMapping; + float temp1, temp2; + float icbweM2Ref, ratio_L; + + STEREO_DFT_DEC_DATA_HANDLE hStereoDft = hCPE->hStereoDft; + STEREO_ICBWE_DEC_HANDLE hStereoICBWE = hCPE->hStereoICBWE; + st = hCPE->hCoreCoder[0]; + + /*--------------------------------------------------------------------* + * skip IC-BWE in case of mono DMX output * + * -------------------------------------------------------------------*/ + + if ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode > STEREO_DFT_RES_COD_OFF ) + { + hCPE->hStereoDft->core_hist[0] = st->core; + + return; + } + else if ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->nchan_out == 1 ) + { + + return; + } + + /*--------------------------------------------------------------------* + * skip IC-BWE in case of SID or NO_DATA frame + * -------------------------------------------------------------------*/ + + if ( st->core_brate <= SID_2k40 ) + { + return; + } + + /*--------------------------------------------------------------------* + * TD high band stereo filling * + * -------------------------------------------------------------------*/ + + /* update buffers for TD stereo filling */ + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + float hb_nrg = EPSILON; + float hb_nrg2 = EPSILON; + + if ( st->core == ACELP_CORE || st->last_core == ACELP_CORE ) + { + for ( i = 0; i < output_frame / 2; i++ ) + { + hb_nrg2 += synthRef[i] * synthRef[i]; + } + + hCPE->hStereoDft->hb_nrg_subr[0] = hb_nrg2; + hb_nrg += hb_nrg2; + hb_nrg2 = EPSILON; + + for ( ; i < output_frame; i++ ) + { + hb_nrg2 += synthRef[i] * synthRef[i]; + } + + hCPE->hStereoDft->hb_nrg_subr[1] = hb_nrg2; + hb_nrg += hb_nrg2; + + mvr2r( synthRef, hCPE->hStereoDft->hb_stefi_sig + hCPE->hStereoDft->hb_stefi_delay, output_frame ); + } + else + { + set_zero( hCPE->hStereoDft->hb_stefi_sig + hCPE->hStereoDft->hb_stefi_delay, output_frame ); + } + hCPE->hStereoDft->hb_nrg_subr[0] *= hCPE->hStereoDft->NFFT / 2; + hCPE->hStereoDft->hb_nrg_subr[1] *= hCPE->hStereoDft->NFFT / 2; + hCPE->hStereoDft->hb_nrg[0] = hb_nrg; + hCPE->hStereoDft->td_gain[0] = 0; + hCPE->hStereoDft->core_hist[0] = st->core; + } + + /*--------------------------------------------------------------------* + * IC-BWE * + * -------------------------------------------------------------------*/ + + if ( st->core != ACELP_CORE || st->extl == -1 || ( hCPE->element_mode == IVAS_CPE_TD && hCPE->hCoreCoder[0]->tdm_LRTD_flag ) ) + { + return; + } + else if ( hCPE->element_mode == IVAS_CPE_DFT && st->core_brate <= SID_2k40 ) + { + mvr2r( synthRef, synth, output_frame ); + return; + } + + + set_f( fb_synth_nonref, 0, L_FRAME48k ); + + /* core switching reset */ + if ( st->last_core != ACELP_CORE || st->bwidth == WB ) + { + ic_bwe_dec_reset( hStereoICBWE ); + + if ( st->last_core != ACELP_CORE ) + { + hStereoICBWE->prevSpecMapping = 0.0f; + hStereoICBWE->prevgsMapping = 1.0f; + hStereoICBWE->icbweM2Ref_prev = 1.0f; + } + + if ( st->bwidth == WB ) + { + /* copy to outputHB and reset hb_synth values */ + mvr2r( synthRef, synth, output_frame ); + + if ( st->element_mode == IVAS_CPE_TD ) + { + hStereoICBWE->prevSpecMapping = 0.0f; + hStereoICBWE->prevgsMapping = 1.0f; + hStereoICBWE->icbweM2Ref_prev = 1.0f; + } + else if ( st->element_mode == IVAS_CPE_DFT ) + { + hStereoICBWE->refChanIndx_bwe = L_CH_INDX; + hStereoICBWE->prevSpecMapping = 0.0f; + + prevgsMapping = hStereoICBWE->prevgsMapping; + temp1 = hStereoDft->side_gain[2 * STEREO_DFT_BAND_MAX + hStereoDft->nbands - 1]; + icbweM2Ref = 1.f + temp1; + gsMapping = 1.f - temp1; + + winLen = (int16_t) ( ( SHB_OVERLAP_LEN * st->output_Fs ) / 16000 ); + winSlope = 1.0f / winLen; + alpha = winSlope; + for ( i = 0; i < winLen; i++ ) + { + synthRef[i] *= ( alpha * ( icbweM2Ref ) + ( 1.0f - alpha ) * ( hStereoICBWE->icbweM2Ref_prev ) ); + synth[i] *= ( alpha * ( gsMapping ) + ( 1.0f - alpha ) * ( prevgsMapping ) ); + alpha += winSlope; + } + for ( ; i < NS2SA( st->output_Fs, FRAME_SIZE_NS ); i++ ) + { + synthRef[i] *= ( icbweM2Ref ); + synth[i] *= ( gsMapping ); + } + hStereoICBWE->icbweM2Ref_prev = icbweM2Ref; + hStereoICBWE->prevgsMapping = gsMapping; + } + + return; + } + } + + if ( !st->bfi ) + { + hStereoICBWE->refChanIndx_bwe = get_next_indice( st, STEREO_ICBWE_REFBITS ); + if ( st->flag_ACELP16k == 1 ) + { + spIndx = get_next_indice( st, STEREO_ICBWE_SPBITS ); + } + else + { + spIndx = 3; + } + if ( st->element_mode == IVAS_CPE_TD ) + { + gsIndx = get_next_indice( st, STEREO_ICBWE_GSBITS ); + } + else + { + gsIndx = get_next_indice( st, STEREO_ICBWE_GSBITS_DFT ); + } + + /* Store indices in case of frame loss */ + hStereoICBWE->prev_spIndx = spIndx; + hStereoICBWE->prev_gsIndx = gsIndx; + } + else /*bfi*/ + { + /* Retrieve last decoded indices */ + spIndx = hStereoICBWE->prev_spIndx; + gsIndx = hStereoICBWE->prev_gsIndx; + hStereoICBWE->refChanIndx_bwe = hStereoICBWE->prev_refChanIndx_bwe; + } + + /* IC-BWE parameter de-quant */ + /* sp Mapping */ + hStereoICBWE->prevSpecMapping = usdequant( spIndx, -0.6f, 0.2f ); + + /* gs Mapping */ + prevgsMapping = hStereoICBWE->prevgsMapping; + + if ( st->element_mode == IVAS_CPE_TD ) + { + hStereoICBWE->prevgsMapping = icbwe_gsMapping_tbl[gsIndx]; + } + else + { + hStereoICBWE->prevgsMapping = icbwe_gsMappingDFT_tbl[gsIndx]; + } + + hStereoICBWE->prevgsMapping = powf( 10, hStereoICBWE->prevgsMapping ); + + specMapping = hStereoICBWE->prevSpecMapping; + gsMapping = hStereoICBWE->prevgsMapping; + + if ( ( st->extl == SWB_TBE || st->extl == FB_TBE ) && st->flag_ACELP16k == 1 ) + { + mvr2r( voice_factors, nlMixFac, NB_SUBFR16k ); + if ( hCPE->hStereoDftDmx != NULL ) + { + if ( hCPE->hStereoDftDmx->targetGain < 0.5f || hCPE->hStereoDftDmx->targetGain > 2.0f ) + { + v_multc( voice_factors, 0.5f, nlMixFac, NB_SUBFR16k ); + } + } + else + { + if ( hCPE->hStereoTCA->targetGain < 0.5f || hCPE->hStereoTCA->targetGain > 2.0f ) + { + v_multc( voice_factors, 0.5f, nlMixFac, NB_SUBFR16k ); + } + } + + nbSubFr = ( st->flag_ACELP16k == 0 ) ? NB_SUBFR : NB_SUBFR16k; + for ( i = 0, k = 0; i < nbSubFr; i++ ) + { + if ( hCPE->hCoreCoder[0]->coder_type == UNVOICED || hStereoICBWE->MSFlag == 1 ) + { + temp1 = 0; + temp2 = 1.0f; + } + else + { + temp1 = sqrtf( nlMixFac[i] ); + temp2 = sqrtf( 1.0f - nlMixFac[i] ); + } + + for ( j = 0; j < L_FRAME16k / nbSubFr; j++, k++ ) + { + excSHB_nonref[k] = temp1 * hStereoICBWE->nlExc16k[k] + temp2 * hStereoICBWE->mixExc16k[k]; + } + } + + /* LP synthesis */ + mvr2r( hStereoICBWE->mem_syn_shb_nonref, shb_synth_nonref, L_SHB_LAHEAD ); + syn_filt( hStereoICBWE->lpSHBRef, LPC_SHB_ORDER, excSHB_nonref, shb_synth_nonref + L_SHB_LAHEAD, L_FRAME16k, hStereoICBWE->mem_lpc_shbsynth_nonref, 1 ); + + prev_pow = sum2_f( shb_synth_nonref, L_SHB_LAHEAD + 10 ); + curr_pow = sum2_f( shb_synth_nonref + L_SHB_LAHEAD + 10, L_SHB_LAHEAD + 10 ); + + if ( prev_pow == 0 ) + { + scale = 0; + } + else + { + scale = sqrtf( curr_pow / prev_pow ); + } + + for ( i = 0; i < L_SHB_LAHEAD; i++ ) + { + shb_synth_nonref[i] *= scale; + } + + for ( ; i < L_SHB_LAHEAD + 10; i++ ) + { + temp = ( i - 19 ) / 10.0f; + shb_synth_nonref[i] *= ( temp * 1.0f + ( 1.0f - temp ) * scale ); + } + /* spec and gs adjustment */ + deemph( shb_synth_nonref + L_SHB_LAHEAD, specMapping, L_FRAME16k, &( hStereoICBWE->memShbSpecMapping ) ); + mvr2r( shb_synth_nonref + L_FRAME16k, hStereoICBWE->mem_syn_shb_nonref, L_SHB_LAHEAD ); + + ScaleShapedSHB( SHB_OVERLAP_LEN, shb_synth_nonref, hStereoICBWE->mem_syn_shb_ola_nonref, hStereoICBWE->gshapeRef, ( hStereoICBWE->gFrameRef * gsMapping * 0.9f ), window_shb, subwin_shb ); + + if ( st->extl == FB_TBE ) + { + v_multc( fb_synth_ref, gsMapping, fb_synth_nonref, L_FRAME48k ); + } + + /* generate 32kHz SHB synthesis from 12.8(16)kHz signal */ + GenSHBSynth( shb_synth_nonref, error, hStereoICBWE->memShbHilbert_nonref, hStereoICBWE->memShbInterp_nonref, st->L_frame, &( hStereoICBWE->syn_dm_phase_nonref ) ); + } + else + { + mvr2r( synthRef, synth, output_frame ); + + winLen = (int16_t) ( ( SHB_OVERLAP_LEN * st->output_Fs ) / 16000 ); + winSlope = 1.0f / winLen; + alpha = winSlope; + + ratio_L = ( hCPE->element_mode == IVAS_CPE_DFT ) ? ( 0.5f ) : ( tdm_ratio_tabl[hCPE->hStereoTD->tdm_last_ratio_idx] ); + + icbweM2Ref = gsMapping; + if ( hStereoICBWE->refChanIndx_bwe == L_CH_INDX ) + { + if ( ratio_L >= 0.1f ) + { + icbweM2Ref = sqrtf( 0.5f - min( 0.5f, ( 1 - ratio_L ) * ( 1 - ratio_L ) * gsMapping * gsMapping ) ) / ratio_L; + } + } + else + { + if ( ratio_L <= 0.9f ) + { + icbweM2Ref = sqrtf( 0.5f - min( 0.5f, ratio_L * ratio_L * gsMapping * gsMapping ) ) / ( 1 - ratio_L ); + } + } + + icbweM2Ref = max( gsMapping, icbweM2Ref ); + + for ( i = 0; i < winLen; i++ ) + { + synthRef[i] *= ( alpha * ( icbweM2Ref ) + ( 1.0f - alpha ) * ( hStereoICBWE->icbweM2Ref_prev ) ); + synth[i] *= ( alpha * ( gsMapping ) + ( 1.0f - alpha ) * ( prevgsMapping ) ); + alpha += winSlope; + } + for ( ; i < NS2SA( st->output_Fs, FRAME_SIZE_NS ); i++ ) + { + synthRef[i] *= ( icbweM2Ref ); + synth[i] *= ( gsMapping ); + } + hStereoICBWE->icbweM2Ref_prev = icbweM2Ref; + + ic_bwe_dec_reset( hStereoICBWE ); + hStereoICBWE->prevSpecMapping = 0.0f; + + return; + } + + /* resample to output FS */ + if ( st->output_Fs == 48000 ) + { + interpolate_3_over_2_allpass( error, L_FRAME32k, synth, hStereoICBWE->memShb_fsout_nonref ); + } + else if ( st->output_Fs == 32000 ) + { + mvr2r( error, synth, L_FRAME32k ); + } + else if ( st->output_Fs == 16000 ) + { + Decimate_allpass_steep( error, hStereoICBWE->memShb_fsout_nonref, L_FRAME32k, synth ); + } + + + if ( st->extl == FB_TBE && st->output_Fs == 48000 ) + { + v_add( fb_synth_nonref, synth, synth, L_FRAME48k ); + } + + /* copy to outputHB and reset hb_synth values */ + ratio_L = ( hCPE->element_mode == IVAS_CPE_DFT ) ? ( 0.5f ) : ( tdm_ratio_tabl[hCPE->hStereoTD->tdm_last_ratio_idx] ); + + icbweM2Ref = gsMapping; + if ( hStereoICBWE->refChanIndx_bwe == L_CH_INDX ) + { + if ( ratio_L >= 0.1f ) + { + icbweM2Ref = sqrtf( 0.5f - min( 0.5f, ( 1 - ratio_L ) * ( 1 - ratio_L ) * gsMapping * gsMapping ) ) / ratio_L; + } + } + else + { + if ( ratio_L <= 0.9f ) + { + icbweM2Ref = sqrtf( 0.5f - min( 0.5f, ratio_L * ratio_L * gsMapping * gsMapping ) ) / ( 1 - ratio_L ); + } + } + + icbweM2Ref = max( gsMapping, icbweM2Ref ); + + winLen = (int16_t) ( ( SHB_OVERLAP_LEN * st->output_Fs ) / 16000 ); + winSlope = 1.0f / winLen; + alpha = winSlope; + for ( i = 0; i < winLen; i++ ) + { + synthRef[i] *= ( alpha * ( icbweM2Ref ) + ( 1.0f - alpha ) * ( hStereoICBWE->icbweM2Ref_prev ) ); + alpha += winSlope; + } + + for ( ; i < NS2SA( st->output_Fs, FRAME_SIZE_NS ); i++ ) + { + synthRef[i] *= ( icbweM2Ref ); + } + + hStereoICBWE->icbweM2Ref_prev = icbweM2Ref; + + return; +} +#else +static Word16 FindScale( + Word32 *buff, + Word16 len, + Word16 Q_buff, + Word16 Q_prev ) +{ + Word32 maxVal; + Word16 norm_shift, Q_out; + + maximum_abs_32_fx( buff, len, &maxVal ); + norm_shift = norm_l( maxVal ); + if ( maxVal == 0 ) + { + norm_shift = 31; + move16(); + } + + Q_out = s_min( Q_prev, add( Q_buff, norm_shift ) ); + + return Q_out; +} + + +void stereo_icBWE_dec_fx( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word32 *synthRef_fx, /* i/o: Reference channel HB synthesis at output Fs Q11 */ + Word32 *synth_fx, /* o : Non reference channel HB synthesis at output Fs Q11 */ + const Word16 *fb_synth_ref_fx, /* i : ref. high-band synthesis 16-20 kHz Q11 */ + const Word16 *voice_factors_fx, /* i : voicing factors Q15 */ + const Word16 output_frame, /* i : frame length */ + Word16 *Q_syn /* i : Q of synth and synthRef buffers */ +) +{ + Word16 i, j, k, nbSubFr; + Decoder_State *st; /* i/o: decoder state structure, primary channel */ + Word16 spIndx, gsIndx; + Word32 excSHB_nonref_fx[L_FRAME16k]; + Word32 shb_synth_nonref_fx[L_FRAME16k + L_SHB_LAHEAD]; + Word32 error_fx[L_FRAME32k]; + Word16 nlMixFac_fx[NB_SUBFR16k]; + Word16 specMapping_fx; + Word16 fb_synth_nonref_fx[L_FRAME48k]; + Word32 prev_pow_fx, curr_pow_fx, maxVal1, maxVal; + Word16 scale_fx, e_scale_fx; + Word16 alpha_fx, winSlope_fx, winLen_fx; + Word16 prevgsMapping_fx; + Word16 temp1_fx, temp2_fx; + Word16 icbweM2Ref_fx, ratio_L_fx; + Word16 gsMapping_fx; +#ifndef FIX_826_PRECISION_LOST_AND_COMPL + Word32 hb_nrg_fx, hb_nrg2_fx; +#else + Word32 hb_nrg_fx; +#endif + Word16 Q_syn_shb; + Word16 shift_prev_pow, synthRef_shift; + Word32 L_tmp; + Word16 tmp; + Word32 L_nlExc16k, L_mixExc16k; + + STEREO_DFT_DEC_DATA_HANDLE hStereoDft = hCPE->hStereoDft; + STEREO_ICBWE_DEC_HANDLE hStereoICBWE = hCPE->hStereoICBWE; + st = hCPE->hCoreCoder[0]; + + /*--------------------------------------------------------------------* + * skip IC-BWE in case of mono DMX output * + * -------------------------------------------------------------------*/ + + test(); + test(); + test(); + IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && EQ_16( hCPE->nchan_out, 1 ) && GT_16( hCPE->hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) ) + { + hCPE->hStereoDft->core_hist[0] = st->core; + move16(); + + return; + } + ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && EQ_16( hCPE->nchan_out, 1 ) ) + { + return; + } + + /*--------------------------------------------------------------------* + * skip IC-BWE in case of SID or NO_DATA frame + * -------------------------------------------------------------------*/ + + IF( LE_32( st->core_brate, SID_2k40 ) ) + { + return; + } + + /*--------------------------------------------------------------------* + * TD high band stereo filling * + * -------------------------------------------------------------------*/ + + /* update buffers for TD stereo filling */ + IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) + { + hb_nrg_fx = 0; + move32(); +#ifndef FIX_826_PRECISION_LOST_AND_COMPL + hb_nrg2_fx = 0; +#endif + move32(); + maximum_abs_32_fx( synthRef_fx, output_frame, &maxVal ); + synthRef_shift = norm_l( maxVal ); + if ( maxVal == 0 ) + { + synthRef_shift = 31; + move16(); + } +#ifndef FIX_826_PRECISION_LOST_AND_COMPL /* Not needed Q11 is already enough */ + synthRef_shift = sub( synthRef_shift, shr( add( find_guarded_bits_fx( output_frame ), 1 ), 1 ) ); +#else + synthRef_shift = sub( synthRef_shift, shr( add( find_guarded_bits_fx( shr( output_frame, 1 ) ), 1 ), 1 ) ); +#endif + test(); + IF( EQ_16( st->core, ACELP_CORE ) || EQ_16( st->last_core, ACELP_CORE ) ) + { +#ifdef FIX_826_PRECISION_LOST_AND_COMPL + Word64 W_tmp = 0; + move64(); + tmp = shl_sat( 1, synthRef_shift ); +#endif + FOR( i = 0; i < shr( output_frame, 1 ); i++ ) + { + // needed to be adjusted for q +#ifndef FIX_826_PRECISION_LOST_AND_COMPL + L_tmp = L_shl( synthRef_fx[i], synthRef_shift ); + hb_nrg2_fx = L_add( hb_nrg2_fx, Mpy_32_32( L_tmp, L_tmp ) ); // 2*(Qx + SynthRef_shift) - 31 +#else + L_tmp = Mpy_32_16_1( synthRef_fx[i], tmp ); + W_tmp = W_mac_32_32( W_tmp, L_tmp, L_tmp ); +#endif + } +#ifdef FIX_826_PRECISION_LOST_AND_COMPL + hb_nrg_fx = W_round48_L( W_tmp ); + hCPE->hStereoDft->hb_nrg_subr_fx[0] = hb_nrg_fx; + move32(); + hStereoDft->q_hb_nrg_subr = sub( shl( add( *Q_syn, synthRef_shift ), 1 ), 45 ); + move16(); + W_tmp = 0; + move64(); + FOR( ; i < output_frame; i++ ) + { + L_tmp = Mpy_32_16_1( synthRef_fx[i], tmp ); + W_tmp = W_mac_32_32( W_tmp, L_tmp, L_tmp ); + } + + hCPE->hStereoDft->hb_nrg_subr_fx[1] = W_round48_L( W_tmp ); // 2*(Qx + SynthRef_shift) - 45 + hb_nrg_fx = L_add( hCPE->hStereoDft->hb_nrg_subr_fx[0], hCPE->hStereoDft->hb_nrg_subr_fx[1] ); +#else + hCPE->hStereoDft->hb_nrg_subr_fx[0] = hb_nrg2_fx; + move32(); + hStereoDft->q_hb_nrg_subr = sub( add( *Q_syn, synthRef_shift ), 31 ); + hb_nrg_fx = L_add( hb_nrg_fx, hb_nrg2_fx ); + hb_nrg2_fx = 0; + move32(); + + FOR( ; i < output_frame; i++ ) + { + L_tmp = L_shl( synthRef_fx[i], synthRef_shift ); + hb_nrg2_fx = L_add( hb_nrg2_fx, Mpy_32_32( L_tmp, L_tmp ) ); + } + + hCPE->hStereoDft->hb_nrg_subr_fx[1] = hb_nrg2_fx; // 2*(Qx + SynthRef_shift) - 31 + move32(); + hb_nrg_fx = L_add( hb_nrg_fx, hb_nrg2_fx ); +#endif + + + Copy32( synthRef_fx, hCPE->hStereoDft->hb_stefi_sig_fx + hCPE->hStereoDft->hb_stefi_delay, output_frame ); +#ifndef FIX_826_PRECISION_LOST_AND_COMPL + Scale_sig32( hCPE->hStereoDft->hb_stefi_sig_fx + hCPE->hStereoDft->hb_stefi_delay, output_frame, -5 ); +#endif + } + ELSE + { + set32_fx( hCPE->hStereoDft->hb_stefi_sig_fx + hCPE->hStereoDft->hb_stefi_delay, 0, output_frame ); +#ifdef MSAN_FIX + hCPE->hStereoDft->hb_nrg_subr_fx[0] = 0; + move32(); + hCPE->hStereoDft->hb_nrg_subr_fx[1] = 0; + move32(); +#endif // MSAN_FIX + } + hCPE->hStereoDft->hb_nrg_subr_fx[0] = ( Mpy_32_16_1( hCPE->hStereoDft->hb_nrg_subr_fx[0], shl( hCPE->hStereoDft->NFFT / 2, 6 ) ) ); // 2 * (Qx + SynthRef_shift) - 40 // 2 * (Qx + SynthRef_shift) - 31 - 15 + move32(); + hCPE->hStereoDft->hb_nrg_subr_fx[1] = ( Mpy_32_16_1( hCPE->hStereoDft->hb_nrg_subr_fx[1], shl( hCPE->hStereoDft->NFFT / 2, 6 ) ) ); // 2 * (Qx + SynthRef_shift) - 40 + move32(); +#ifndef FIX_826_PRECISION_LOST_AND_COMPL + hCPE->hStereoDft->q_hb_nrg_subr = sub( shl( ( *Q_syn + synthRef_shift ), 1 ), 40 ); +#else + hCPE->hStereoDft->q_hb_nrg_subr = sub( shl( ( *Q_syn + synthRef_shift ), 1 ), 45 + 9 ); +#endif + hCPE->hStereoDft->hb_nrg_fx[0] = hb_nrg_fx; // 2 * (Qx + SynthRef_shift) - 31 + move32(); + hCPE->hStereoDft->td_gain_fx[0] = 0; + move32(); + hCPE->hStereoDft->core_hist[0] = st->core; + move16(); + } + + /*--------------------------------------------------------------------* + * IC-BWE * + * -------------------------------------------------------------------*/ + test(); + test(); + test(); + test(); + IF( st->core != ACELP_CORE || EQ_16( st->extl, -1 ) || ( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && NE_16( hCPE->hCoreCoder[0]->tdm_LRTD_flag, 0 ) ) ) + { + return; + } + ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && LE_32( st->core_brate, SID_2k40 ) ) + { + Copy32( synthRef_fx, synth_fx, output_frame ); + return; + } + + + set16_fx( fb_synth_nonref_fx, 0, L_FRAME48k ); + + /* core switching reset */ + test(); + IF( st->last_core != ACELP_CORE || EQ_16( st->bwidth, (Word16) WB ) ) + { + ic_bwe_dec_reset_fx( hStereoICBWE ); + + IF( st->last_core != ACELP_CORE ) + { + hStereoICBWE->prevSpecMapping_fx = 0; + move16(); + hStereoICBWE->prevgsMapping_fx = 16384; + move16(); + hStereoICBWE->icbweM2Ref_prev_fx = 16384; + move16(); + } + + IF( EQ_16( st->bwidth, WB ) ) + { + /* copy to outputHB and reset hb_synth values */ + Copy32( synthRef_fx, synth_fx, output_frame ); + + IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) + { + hStereoICBWE->prevSpecMapping_fx = 0; + move16(); + hStereoICBWE->prevgsMapping_fx = 16384; + move16(); + hStereoICBWE->icbweM2Ref_prev_fx = 16384; + move16(); + } + ELSE IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) + { + hStereoICBWE->refChanIndx_bwe = L_CH_INDX; + move16(); + hStereoICBWE->prevSpecMapping_fx = 0; + move16(); + + prevgsMapping_fx = hStereoICBWE->prevgsMapping_fx; + move16(); + temp1_fx = shr( extract_h( hStereoDft->side_gain_fx[2 * STEREO_DFT_BAND_MAX + hStereoDft->nbands - 1] ), 1 ); + icbweM2Ref_fx = add( 16384, temp1_fx ); + gsMapping_fx = sub( 16384, temp1_fx ); + + winLen_fx = extract_l( Mpy_32_16_1( st->output_Fs, 41 ) ); //(int16_t)((SHB_OVERLAP_LEN * st->output_Fs) / 16000); + winSlope_fx = div_s( 1, winLen_fx ); + alpha_fx = winSlope_fx; + move16(); + FOR( i = 0; i < winLen_fx; i++ ) + { +#ifndef FIX_826_PRECISION_LOST_AND_COMPL + L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); // Q15 + Q14 + L_tmp = L_mac0( L_tmp, sub( 32767, alpha_fx ), ( hStereoICBWE->icbweM2Ref_prev_fx ) ); // Q15 + Q14; + tmp = shl( round_fx( L_tmp ), 1 ); // Q = 15 + 14 - 16 + 1 = Q14 + synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp ); + move32(); + L_tmp = L_mult0( alpha_fx, gsMapping_fx ); + L_tmp = L_mac0( L_tmp, ( sub( 32767, alpha_fx ) ), ( prevgsMapping_fx ) ); + tmp = shl( round_fx( L_tmp ), 1 ); // Q = 15 + 14 - 16 + 1 = Q14 + synth_fx[i] = Mpy_32_16_1( synth_fx[i], tmp ); + move32(); + IF( LE_16( alpha_fx, sub( 32767, winSlope_fx ) ) ) + { + alpha_fx = add( alpha_fx, winSlope_fx ); + } +#else + /*synthRef[i] *= ( alpha * ( icbweM2Ref ) + ( 1.0f - alpha ) * ( hStereoICBWE->icbweM2Ref_prev ) );*/ + temp1_fx = sub( 32767, alpha_fx ); + L_tmp = L_mult( alpha_fx, icbweM2Ref_fx ); // Q15 + Q14 + 1 + L_tmp = L_mac( L_tmp, temp1_fx, hStereoICBWE->icbweM2Ref_prev_fx ); // Q15 + Q14 +1 ; + synthRef_fx[i] = L_shl( Mpy_32_32( synthRef_fx[i], L_tmp ), 1 ); + move32(); + /*synth[i] *= ( alpha * ( gsMapping ) + ( 1.0f - alpha ) * ( prevgsMapping ) );*/ + L_tmp = L_mult( alpha_fx, gsMapping_fx ); + L_tmp = L_mac( L_tmp, temp1_fx, prevgsMapping_fx ); + synth_fx[i] = L_shl( Mpy_32_32( synth_fx[i], L_tmp ), 1 ); + move32(); + alpha_fx = add_sat( alpha_fx, winSlope_fx ); +#endif + } + FOR( ; i < NS2SA( st->output_Fs, FRAME_SIZE_NS ); i++ ) + { + synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], icbweM2Ref_fx ); + move32(); + synth_fx[i] = Mpy_32_16_1( synth_fx[i], gsMapping_fx ); + move32(); + } + hStereoICBWE->icbweM2Ref_prev_fx = icbweM2Ref_fx; + move16(); + hStereoICBWE->prevgsMapping_fx = gsMapping_fx; + move16(); + + *Q_syn = sub( *Q_syn, 1 ); + } + + return; + } + } + + IF( st->bfi == 0 ) + { + hStereoICBWE->refChanIndx_bwe = get_next_indice_fx( st, STEREO_ICBWE_REFBITS ); + IF( EQ_16( st->flag_ACELP16k, 1 ) ) + { + spIndx = get_next_indice_fx( st, STEREO_ICBWE_SPBITS ); + } + ELSE + { + spIndx = 3; + move16(); + } + IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) + { + gsIndx = get_next_indice_fx( st, STEREO_ICBWE_GSBITS ); + } + ELSE + { + gsIndx = get_next_indice_fx( st, STEREO_ICBWE_GSBITS_DFT ); + } + + /* Store indices in case of frame loss */ + hStereoICBWE->prev_spIndx = spIndx; + move16(); + hStereoICBWE->prev_gsIndx = gsIndx; + move16(); + } + ELSE /*bfi*/ + { + /* Retrieve last decoded indices */ + spIndx = hStereoICBWE->prev_spIndx; + move16(); + gsIndx = hStereoICBWE->prev_gsIndx; + move16(); + hStereoICBWE->refChanIndx_bwe = hStereoICBWE->prev_refChanIndx_bwe; + move16(); + } + + /* IC-BWE parameter de-quant */ + /* sp Mapping */ + hStereoICBWE->prevSpecMapping_fx = usdequant_fx( spIndx, -19661, 3277 ); // Q15 + + /* gs Mapping */ + prevgsMapping_fx = hStereoICBWE->prevgsMapping_fx; // Q14 + move16(); + + IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) + { + hStereoICBWE->prevgsMapping_fx = pow_10_icbwe_gsMapping_tbl_fx[gsIndx]; + move16(); + } + ELSE + { + hStereoICBWE->prevgsMapping_fx = pow_10_icbwe_gsMappingDFT_tbl_fx[gsIndx]; + move16(); + } + + // hStereoICBWE->prevgsMapping = powf( 10, hStereoICBWE->prevgsMapping ); + + specMapping_fx = hStereoICBWE->prevSpecMapping_fx; // Q15 + move16(); + gsMapping_fx = hStereoICBWE->prevgsMapping_fx; // Q14 + move16(); + + test(); + test(); + IF( ( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, FB_TBE ) ) && EQ_16( st->flag_ACELP16k, 1 ) ) + { + Copy( voice_factors_fx, nlMixFac_fx, NB_SUBFR16k ); // Q15 + IF( hCPE->hStereoDftDmx != NULL ) + { + test(); + IF( LT_32( hCPE->hStereoDftDmx->targetGain_fx, 268435456 ) || GT_32( hCPE->hStereoDftDmx->targetGain_fx, 1073741824 ) ) + { + v_multc_fixed_16_16( voice_factors_fx, 16384, nlMixFac_fx, NB_SUBFR16k ); + } + } + ELSE + { + test(); + IF( LT_32( hCPE->hStereoTCA->targetGain_fx, 268435456 ) || GT_32( hCPE->hStereoTCA->targetGain_fx, 1073741824 ) ) + { + v_multc_fixed_16_16( voice_factors_fx, 16384, nlMixFac_fx, NB_SUBFR16k ); + } + } + + // nbSubFr = ( st->flag_ACELP16k == 0 ) ? NB_SUBFR : NB_SUBFR16k; + IF( st->flag_ACELP16k == 0 ) + { + nbSubFr = NB_SUBFR; + move16(); + } + ELSE + { + nbSubFr = NB_SUBFR16k; + move16(); + } + k = 0; + move16(); + FOR( i = 0; i < nbSubFr; i++ ) + { + IF( EQ_16( hCPE->hCoreCoder[0]->coder_type, UNVOICED ) || EQ_16( hStereoICBWE->MSFlag, 1 ) ) + { + temp1_fx = 0; + move16(); + temp2_fx = 32767; + move16(); + } + ELSE + { + tmp = 0; + move16(); + temp1_fx = Sqrt16( nlMixFac_fx[i], &tmp ); + IF( LT_16( tmp, 0 ) ) + { + temp1_fx = shl( temp1_fx, tmp ); + } + tmp = 0; + move16(); + temp2_fx = Sqrt16( sub( 32767, nlMixFac_fx[i] ), &tmp ); + IF( LT_16( tmp, 0 ) ) + { + temp2_fx = shl( temp2_fx, tmp ); + } + } + + FOR( j = 0; j < L_FRAME16k / nbSubFr; j++ ) + { + // common Q for addition + L_nlExc16k = L_deposit_l( hStereoICBWE->nlExc16k_fx[k] ); // prev_q_bwe_exc - 16 + L_mixExc16k = L_deposit_l( hStereoICBWE->mixExc16k_fx[k] ); // Q_exc + L_nlExc16k = L_shl( L_nlExc16k, sub( Q_icBWE, ( sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // Q_icBWE +#ifndef FIX_736_BWE_SECT_C + L_mixExc16k = L_shl( L_mixExc16k, Q_icBWE - st->Q_exc ); // Q_icBWE +#else + L_mixExc16k = L_shl( L_mixExc16k, sub( Q_icBWE, ( sub( st->prev_Q_bwe_exc, 25 ) ) ) ); // Q_icBWE +#endif + excSHB_nonref_fx[k] = L_add( Mpy_32_16_1( L_nlExc16k, temp1_fx ), Mpy_32_16_1( L_mixExc16k, temp2_fx ) ); // Q_icBWE + move32(); + k++; + } + } + + /* LP synthesis */ + Q_syn_shb = 31; + move16(); + + Q_syn_shb = FindScale( hStereoICBWE->mem_syn_shb_nonref_fx, LPC_SHB_ORDER, hStereoICBWE->prev_Q_syn_shb_nonref, Q_syn_shb ); + Q_syn_shb = FindScale( hStereoICBWE->lpSHBRef_fx, LPC_SHB_ORDER + 1, 12, Q_syn_shb ); + Q_syn_shb = FindScale( excSHB_nonref_fx, L_FRAME16k, Q_icBWE, Q_syn_shb ); + Q_syn_shb = FindScale( hStereoICBWE->mem_lpc_shbsynth_nonref_fx, LPC_SHB_ORDER, hStereoICBWE->prev_Q_lpc_shbsynth_nonref, Q_syn_shb ); + + Q_syn_shb = sub( Q_syn_shb, 3 ); // gaurded bits + + Scale_sig32( hStereoICBWE->lpSHBRef_fx, LPC_SHB_ORDER + 1, sub( Q_syn_shb, 12 ) ); + Scale_sig32( excSHB_nonref_fx, L_FRAME16k, sub( Q_syn_shb, Q_icBWE ) ); + Scale_sig32( hStereoICBWE->mem_lpc_shbsynth_nonref_fx, LPC_SHB_ORDER, sub( Q_syn_shb, hStereoICBWE->prev_Q_lpc_shbsynth_nonref ) ); + Scale_sig32( hStereoICBWE->mem_syn_shb_nonref_fx, L_SHB_LAHEAD, sub( Q_syn_shb, hStereoICBWE->prev_Q_syn_shb_nonref ) ); + + + Copy32( hStereoICBWE->mem_syn_shb_nonref_fx, shb_synth_nonref_fx, L_SHB_LAHEAD ); + + E_UTIL_synthesis_fx( 0, hStereoICBWE->lpSHBRef_fx, excSHB_nonref_fx, shb_synth_nonref_fx + L_SHB_LAHEAD, L_FRAME16k, hStereoICBWE->mem_lpc_shbsynth_nonref_fx, 1, LPC_SHB_ORDER ); + + hStereoICBWE->prev_Q_lpc_shbsynth_nonref = Q_syn_shb; + move16(); + + maximum_abs_32_fx( shb_synth_nonref_fx, L_SHB_LAHEAD + 10 + L_SHB_LAHEAD + 10, &maxVal1 ); // Qsyn_shb + + shift_prev_pow = sub( norm_l( maxVal1 ), find_guarded_bits_fx( L_SHB_LAHEAD + 10 ) ); + + prev_pow_fx = 0; + move32(); + curr_pow_fx = 0; + move32(); + FOR( i = 0; i < L_SHB_LAHEAD + 10; i++ ) + { + L_tmp = L_shl( shb_synth_nonref_fx[i], shift_prev_pow ); + prev_pow_fx = L_add( prev_pow_fx, Mpy_32_32( L_tmp, L_tmp ) ); + } + FOR( i = 0; i < L_SHB_LAHEAD + 10; i++ ) + { + L_tmp = L_shl( shb_synth_nonref_fx[L_SHB_LAHEAD + 10 + i], shift_prev_pow ); + curr_pow_fx = L_add( curr_pow_fx, Mpy_32_32( L_tmp, L_tmp ) ); + } + + IF( EQ_32( prev_pow_fx, 0 ) ) + { + e_scale_fx = 0; + move16(); + scale_fx = 0; + move16(); + } + ELSE + { + e_scale_fx = 0; + move16(); + scale_fx = BASOP_Util_Divide3232_Scale( curr_pow_fx, prev_pow_fx, &e_scale_fx ); + scale_fx = Sqrt16( scale_fx, &e_scale_fx ); + } + IF( LT_16( e_scale_fx, 0 ) ) + { + scale_fx = shl( scale_fx, e_scale_fx ); + e_scale_fx = 0; + move16(); + } + FOR( i = 0; i < L_SHB_LAHEAD; i++ ) + { + shb_synth_nonref_fx[i] = Mpy_32_16_1( shb_synth_nonref_fx[i], scale_fx ); + move32(); + } + tmp = 3276; + move16(); + FOR( ; i < L_SHB_LAHEAD + 10; i++ ) + { + IF( EQ_16( e_scale_fx, 0 ) ) + { + temp1_fx = 32767; + move16(); + } + ELSE + { + temp1_fx = shl( 1, sub( 15, e_scale_fx ) ); + move16(); + } + L_tmp = L_mult0( tmp, temp1_fx ); + L_tmp = L_mac0( L_tmp, sub( 32767, tmp ), scale_fx ); + shb_synth_nonref_fx[i] = Mpy_32_16_1( shb_synth_nonref_fx[i], shl( round_fx( L_tmp ), 1 ) ); + move32(); + IF( LT_16( tmp, 29492 ) ) + { + tmp = add( tmp, 3276 ); + } + } + + /* spec and gs adjustment */ + Q_syn_shb = sub( Q_syn_shb, e_scale_fx ); + Scale_sig32( shb_synth_nonref_fx + L_SHB_LAHEAD + 10, L_FRAME16k - 10, -e_scale_fx ); + + tmp = 31; + move16(); + tmp = FindScale( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, Q_syn_shb, tmp ); + temp1_fx = norm_l( hStereoICBWE->memShbSpecMapping_fx ); + IF( EQ_32( hStereoICBWE->memShbSpecMapping_fx, 0 ) ) + { + temp1_fx = 31; + move16(); + } + temp1_fx = add( temp1_fx, hStereoICBWE->prev_Q_memshbspec ); + tmp = s_min( temp1_fx, tmp ); + + tmp = sub( tmp, 9 ); + + Scale_sig32( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, tmp - Q_syn_shb ); + hStereoICBWE->memShbSpecMapping_fx = L_shl( hStereoICBWE->memShbSpecMapping_fx, sub( tmp, hStereoICBWE->prev_Q_memshbspec ) ); + + hStereoICBWE->prev_Q_memshbspec = tmp; + move16(); + Q_syn_shb = tmp; + move16(); + + deemph_fx_32( 0, shb_synth_nonref_fx + L_SHB_LAHEAD, specMapping_fx, L_FRAME16k, &( hStereoICBWE->memShbSpecMapping_fx ) ); + hStereoICBWE->prev_Q_memshbspec = Q_syn_shb; + move16(); + Copy32( shb_synth_nonref_fx + L_FRAME16k, hStereoICBWE->mem_syn_shb_nonref_fx, L_SHB_LAHEAD ); + hStereoICBWE->prev_Q_syn_shb_nonref = Q_syn_shb; + move16(); + + tmp = 31; + move16(); + tmp = FindScale( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, Q_syn_shb, tmp ); + tmp = FindScale( hStereoICBWE->mem_syn_shb_ola_nonref_fx, L_SHB_LAHEAD, hStereoICBWE->prev_Q_syn_shb_ola_nonref, tmp ); + + tmp = sub( tmp, 3 ); + + Scale_sig32( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, tmp - Q_syn_shb ); + Scale_sig32( hStereoICBWE->mem_syn_shb_ola_nonref_fx, L_SHB_LAHEAD, tmp - hStereoICBWE->prev_Q_syn_shb_ola_nonref ); + + ScaleShapedSHB_32( SHB_OVERLAP_LEN, shb_synth_nonref_fx, hStereoICBWE->mem_syn_shb_ola_nonref_fx, hStereoICBWE->gshapeRef_fx, ( Mpy_32_16_1( L_shl( hStereoICBWE->gFrameRef_fx, 1 ), mult_r( gsMapping_fx, 29492 ) ) ), window_shb_fx, subwin_shb_fx, &tmp, &temp1_fx ); + + hStereoICBWE->prev_Q_syn_shb_ola_nonref = tmp; + move16(); + Q_syn_shb = tmp; + move16(); + + IF( EQ_16( st->extl, FB_TBE ) ) + { + v_multc_fixed_16_16( fb_synth_ref_fx, gsMapping_fx, fb_synth_nonref_fx, L_FRAME48k ); + } + + /* generate 32kHz SHB synthesis from 12.8(16)kHz signal */ + + tmp = 31; + move16(); + tmp = FindScale( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, Q_syn_shb, tmp ); + tmp = FindScale( hStereoICBWE->memShbHilbert_nonref_fx, HILBERT_MEM_SIZE, hStereoICBWE->prev_Q_hilb, tmp ); + tmp = FindScale( hStereoICBWE->memShbInterp_nonref_fx, 2 * ALLPASSSECTIONS_STEEP + 1, hStereoICBWE->prev_Q_interp, tmp ); + + tmp = sub( tmp, 3 ); + + Scale_sig32( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, sub( tmp, Q_syn_shb ) ); + Scale_sig32( hStereoICBWE->memShbHilbert_nonref_fx, HILBERT_MEM_SIZE, sub( tmp, hStereoICBWE->prev_Q_hilb ) ); + Scale_sig32( hStereoICBWE->memShbInterp_nonref_fx, 2 * ALLPASSSECTIONS_STEEP + 1, sub( tmp, hStereoICBWE->prev_Q_interp ) ); + + hStereoICBWE->prev_Q_hilb = tmp; + move16(); + hStereoICBWE->prev_Q_interp = tmp; + move16(); + + Q_syn_shb = tmp; + move16(); + + GenSHBSynth_fx_32( shb_synth_nonref_fx, error_fx, hStereoICBWE->memShbHilbert_nonref_fx, hStereoICBWE->memShbInterp_nonref_fx, st->L_frame, &( hStereoICBWE->syn_dm_phase_nonref ) ); + } + ELSE + { + Copy32( synthRef_fx, synth_fx, output_frame ); + + winLen_fx = extract_l( Mpy_32_16_1( st->output_Fs, 41 ) ); + winSlope_fx = div_s( 1, winLen_fx ); + alpha_fx = winSlope_fx; + move16(); + + + IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) + { + ratio_L_fx = 16384; + move16(); + } + ELSE + { + ratio_L_fx = extract_h( tdm_ratio_tabl_fx[hCPE->hStereoTD->tdm_last_ratio_idx] ); + move16(); + } + + icbweM2Ref_fx = gsMapping_fx; + move16(); + IF( hStereoICBWE->refChanIndx_bwe == L_CH_INDX ) + { + + IF( GE_16( ratio_L_fx, 3276 ) ) + { + tmp = mult_r( sub( 32767, ratio_L_fx ), sub( 32767, ratio_L_fx ) ); // Q15 + tmp = mult_r( tmp, gsMapping_fx ); // Q14 + tmp = mult_r( tmp, gsMapping_fx ); // Q13 + IF( LT_16( tmp, 4096 ) ) + { + temp1_fx = 0; + move16(); + temp2_fx = 0; + move16(); + tmp = shl( tmp, 2 ); + icbweM2Ref_fx = Sqrt16( sub( 16384, tmp ), &temp1_fx ); + icbweM2Ref_fx = BASOP_Util_Divide1616_Scale( icbweM2Ref_fx, ratio_L_fx, &temp2_fx ); + icbweM2Ref_fx = shl( icbweM2Ref_fx, add( temp2_fx, sub( temp1_fx, 1 ) ) ); // Q14 + } + ELSE + { + icbweM2Ref_fx = 0; + move16(); + } + } + } + ELSE + { + IF( LE_16( ratio_L_fx, 29490 ) ) + { +#ifdef FIX_TMP_714 + tmp = mult_r( ratio_L_fx, ratio_L_fx ); // Q15 +#else + tmp = mult_r( sub( 32767, ratio_L_fx ), sub( 32767, ratio_L_fx ) ); // Q15 +#endif + tmp = mult_r( tmp, gsMapping_fx ); // Q14 + tmp = mult_r( tmp, gsMapping_fx ); // Q13 + IF( LT_16( tmp, 4096 ) ) + { + temp1_fx = 0; + move16(); + temp2_fx = 0; + move16(); + tmp = shl( tmp, 2 ); + icbweM2Ref_fx = Sqrt16( sub( 16384, tmp ), &temp1_fx ); + icbweM2Ref_fx = BASOP_Util_Divide1616_Scale( icbweM2Ref_fx, sub( 32767, ratio_L_fx ), &temp2_fx ); + icbweM2Ref_fx = shl( icbweM2Ref_fx, add( temp2_fx, sub( temp1_fx, 1 ) ) ); // Q14 + } + ELSE + { + icbweM2Ref_fx = 0; + move16(); + } + } + } + + icbweM2Ref_fx = s_max( gsMapping_fx, icbweM2Ref_fx ); + + FOR( i = 0; i < winLen_fx; i++ ) + { + L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); + L_tmp = L_mac0( L_tmp, sub( 32767, alpha_fx ), hStereoICBWE->icbweM2Ref_prev_fx ); + tmp = shl( round_fx( L_tmp ), 1 ); + synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp ); + move32(); + L_tmp = L_mult0( alpha_fx, gsMapping_fx ); + L_tmp = L_mac0( L_tmp, sub( 32767, alpha_fx ), prevgsMapping_fx ); + tmp = shl( round_fx( L_tmp ), 1 ); + synth_fx[i] = Mpy_32_16_1( synth_fx[i], tmp ); + move32(); + IF( LE_16( alpha_fx, sub( 32767, winSlope_fx ) ) ) + { + alpha_fx = add( alpha_fx, winSlope_fx ); + } + } + FOR( ; i < NS2SA( st->output_Fs, FRAME_SIZE_NS ); i++ ) + { + synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], icbweM2Ref_fx ); + move32(); + synth_fx[i] = Mpy_32_16_1( synth_fx[i], gsMapping_fx ); + move32(); + } + hStereoICBWE->icbweM2Ref_prev_fx = icbweM2Ref_fx; + move16(); + + ic_bwe_dec_reset_fx( hStereoICBWE ); + hStereoICBWE->prevSpecMapping_fx = 0; + move16(); + + *Q_syn = sub( *Q_syn, 1 ); + + return; + } + + /* resample to output FS */ + + + IF( EQ_32( st->output_Fs, 48000 ) ) + { + tmp = 31; + move16(); + tmp = FindScale( error_fx, L_FRAME32k, Q_syn_shb, tmp ); + tmp = FindScale( hStereoICBWE->memShb_fsout_nonref_fx, INTERP_3_2_MEM_LEN, hStereoICBWE->prev_Q_fsout, tmp ); + tmp = sub( tmp, 4 ); + + Scale_sig32( error_fx, L_FRAME32k, sub( tmp, Q_syn_shb ) ); + Scale_sig32( hStereoICBWE->memShb_fsout_nonref_fx, INTERP_3_2_MEM_LEN, sub( tmp, hStereoICBWE->prev_Q_fsout ) ); + interpolate_3_over_2_allpass_32( error_fx, L_FRAME32k, synth_fx, hStereoICBWE->memShb_fsout_nonref_fx ); + hStereoICBWE->prev_Q_fsout = tmp; + move16(); + } + ELSE IF( EQ_32( st->output_Fs, 32000 ) ) + { + Copy32( error_fx, synth_fx, L_FRAME32k ); + } + ELSE IF( EQ_32( st->output_Fs, 16000 ) ) + { + tmp = 31; + move16(); + tmp = FindScale( error_fx, L_FRAME32k, Q_syn_shb, tmp ); + tmp = FindScale( hStereoICBWE->memShb_fsout_nonref_fx, INTERP_3_2_MEM_LEN, hStereoICBWE->prev_Q_fsout, tmp ); + tmp = sub( tmp, 4 ); + + Scale_sig32( error_fx, L_FRAME32k, sub( tmp, Q_syn_shb ) ); + Scale_sig32( hStereoICBWE->memShb_fsout_nonref_fx, INTERP_3_2_MEM_LEN, sub( tmp, hStereoICBWE->prev_Q_fsout ) ); + Decimate_allpass_steep_fx32( error_fx, hStereoICBWE->memShb_fsout_nonref_fx, L_FRAME32k, synth_fx ); + hStereoICBWE->prev_Q_fsout = tmp; + move16(); + } +#ifndef MSAN_FIX + Scale_sig32( synth_fx, L_FRAME48k, sub( *Q_syn, add( 1, tmp ) ) ); +#else + Scale_sig32( synth_fx, output_frame, sub( *Q_syn, add( 1, tmp ) ) ); +#endif + + *Q_syn = sub( *Q_syn, 1 ); + + test(); + IF( EQ_16( st->extl, FB_TBE ) && EQ_32( st->output_Fs, 48000 ) ) + { + + // v_add( fb_synth_nonref_fx, synth_fx, synth_fx, L_FRAME48k, 0 ); + FOR( i = 0; i < L_FRAME48k; i++ ) + { + synth_fx[i] = L_add( synth_fx[i], L_deposit_l( fb_synth_nonref_fx[i] ) ); + move32(); + } + } + + /* copy to outputHB and reset hb_synth values */ + + IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) + { + ratio_L_fx = 16384; + move16(); + } + ELSE + { + ratio_L_fx = extract_h( tdm_ratio_tabl_fx[hCPE->hStereoTD->tdm_last_ratio_idx] ); + move16(); + } + + icbweM2Ref_fx = gsMapping_fx; + move16(); + IF( hStereoICBWE->refChanIndx_bwe == L_CH_INDX ) + { + IF( GE_16( ratio_L_fx, 3276 ) ) + { + tmp = mult_r( sub( 32767, ratio_L_fx ), sub( 32767, ratio_L_fx ) ); // Q15 + tmp = mult_r( tmp, gsMapping_fx ); // Q14 + tmp = mult_r( tmp, gsMapping_fx ); // Q13 + IF( LT_16( tmp, 4096 ) ) + { + temp1_fx = 0; + move16(); + temp2_fx = 0; + move16(); + tmp = shl( tmp, 2 ); + icbweM2Ref_fx = Sqrt16( sub( 16384, tmp ), &temp1_fx ); + icbweM2Ref_fx = BASOP_Util_Divide1616_Scale( icbweM2Ref_fx, ratio_L_fx, &temp2_fx ); + icbweM2Ref_fx = shl( icbweM2Ref_fx, add( temp1_fx, sub( temp2_fx, 1 ) ) ); // Q14 + } + ELSE + { + icbweM2Ref_fx = 0; + move16(); + } + } + } + ELSE + { + IF( LE_16( ratio_L_fx, 29490 ) ) + { +#ifdef FIX_TMP_714 + tmp = mult_r( ratio_L_fx, ratio_L_fx ); // Q15 +#else + tmp = mult_r( sub( 32767, ratio_L_fx ), sub( 32767, ratio_L_fx ) ); // Q15 +#endif + tmp = mult_r( tmp, gsMapping_fx ); // Q14 + tmp = mult_r( tmp, gsMapping_fx ); // Q13 + IF( LT_16( tmp, 4096 ) ) + { + temp1_fx = 0; + move16(); + temp2_fx = 0; + move16(); + tmp = shl( tmp, 2 ); + icbweM2Ref_fx = Sqrt16( sub( 16384, tmp ), &temp1_fx ); + icbweM2Ref_fx = BASOP_Util_Divide1616_Scale( icbweM2Ref_fx, sub( 32767, ratio_L_fx ), &temp2_fx ); + icbweM2Ref_fx = shl( icbweM2Ref_fx, add( temp2_fx, sub( temp1_fx, 1 ) ) ); // Q14 + } + ELSE + { + icbweM2Ref_fx = 0; + move16(); + } + } + } + + icbweM2Ref_fx = s_max( gsMapping_fx, icbweM2Ref_fx ); + + winLen_fx = extract_l( Mpy_32_16_1( st->output_Fs, 41 ) ); + winSlope_fx = div_s( 1, winLen_fx ); + alpha_fx = winSlope_fx; + move16(); + FOR( i = 0; i < winLen_fx; i++ ) + { + L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); + L_tmp = L_mac0( L_tmp, sub( 32767, alpha_fx ), hStereoICBWE->icbweM2Ref_prev_fx ); + tmp = shl( round_fx( L_tmp ), 1 ); + synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp ); + move32(); + IF( LE_16( alpha_fx, sub( 32767, winSlope_fx ) ) ) + { + alpha_fx = add( alpha_fx, winSlope_fx ); + } + } + + FOR( ; i < NS2SA( st->output_Fs, FRAME_SIZE_NS ); i++ ) + { + synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], icbweM2Ref_fx ); + move32(); + } + + hStereoICBWE->icbweM2Ref_prev_fx = icbweM2Ref_fx; + move16(); + + return; +} +#endif + +/*-------------------------------------------------------------------* + * stereo_icBWE_decproc() + * + * Stereo (inter-channel) BWE mapping - decoder initialization + *-------------------------------------------------------------------*/ + +#ifndef IVAS_FLOAT_FIXED +void stereo_icBWE_decproc( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float *output[CPE_CHANNELS], /* i/o: output synthesis */ + float outputHB[CPE_CHANNELS][L_FRAME48k], /* i : HB synthesis */ + const int16_t last_core, /* i : last core, primary channel */ + const int16_t last_bwidth, /* i : last bandwidth */ + const int16_t output_frame /* i : frame length */ +) +{ + int16_t i, j, n, decoderDelay, icbweOLASize, dftOvlLen; + int16_t core, memOffset, refChanIndx_bwe; + float temp0[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )], temp1[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )]; + float winSlope, alpha; + const float *win_dft; + int32_t extl_brate, output_Fs; + + STEREO_ICBWE_DEC_HANDLE hStereoICBWE = hCPE->hStereoICBWE; + + + /*--------------------------------------------------------------------* + * skip IC-BWE in case of SID or NO_DATA frame + * -------------------------------------------------------------------*/ + + if ( ( hCPE->element_mode == IVAS_CPE_TD || hCPE->element_mode == IVAS_CPE_DFT ) && hCPE->nchan_out == 2 /*&& hCPE->hCoreCoder[0]->core_brate > SID_2k40*/ && hCPE->hCoreCoder[0]->last_core_brate <= SID_2k40 ) + { + stereo_icBWE_init_dec( hCPE->hStereoICBWE ); + } + + if ( hCPE->hCoreCoder[0]->core_brate <= SID_2k40 ) + { + return; + } + + /*--------------------------------------------------------------------* + * skip IC-BWE in case of mono DMX output * + * -------------------------------------------------------------------*/ + + if ( hCPE->nchan_out == 1 && hCPE->element_mode == IVAS_CPE_DFT ) + { + add_HB_to_mono_dmx( hCPE, output[0], outputHB[0], last_core, output_frame ); + + return; + } + else if ( hCPE->nchan_out == 1 && hCPE->element_mode != IVAS_CPE_TD ) + { + return; + } + + /*--------------------------------------------------------------------* + * IC-BWE processing + * -------------------------------------------------------------------*/ + + core = hCPE->hCoreCoder[0]->core; + extl_brate = hCPE->hCoreCoder[0]->extl_brate; + output_Fs = hCPE->hCoreCoder[0]->output_Fs; + + memOffset = NS2SA( output_Fs, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); + + /* LRTD stereo mode - 2xBWEs used */ + if ( hCPE->element_mode == IVAS_CPE_TD && hCPE->hCoreCoder[0]->tdm_LRTD_flag ) + { + /* delay HB synth */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + mvr2r( outputHB[n] + output_frame - memOffset, temp0, memOffset ); + mvr2r( outputHB[n], outputHB[n] + memOffset, output_frame - memOffset ); + mvr2r( hCPE->prev_hb_synth[n], outputHB[n], memOffset ); + mvr2r( temp0, hCPE->prev_hb_synth[n], memOffset ); + } + + if ( hCPE->nchan_out == 1 ) + { + /* stereo to mono downmix */ + for ( i = 0; i < output_frame; i++ ) + { + outputHB[0][i] = ( outputHB[0][i] + outputHB[1][i] ) * 0.5f; + } + v_add( output[0], outputHB[0], output[0], output_frame ); + } + else + { + /* Add the delayed hb_synth component to the delayed ACELP synthesis */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + v_add( output[n], outputHB[n], output[n], output_frame ); + } + } + } + else + { + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + set_f( hCPE->prev_hb_synth[n], 0, memOffset ); + } + } + + if ( hCPE->element_mode != IVAS_CPE_MDCT && !( hCPE->element_mode == IVAS_CPE_TD && hCPE->hCoreCoder[0]->tdm_LRTD_flag ) ) + { + if ( hCPE->last_element_mode == IVAS_CPE_MDCT ) + { + set_f( hStereoICBWE->memOutHB[0], 0, memOffset ); + set_f( hStereoICBWE->memOutHB[1], 0, memOffset ); + + set_f( hStereoICBWE->memTransitionHB[0], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + set_f( hStereoICBWE->memTransitionHB[1], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + } + + if ( core == ACELP_CORE && extl_brate > 0 ) + { + refChanIndx_bwe = hStereoICBWE->refChanIndx_bwe; + + if ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->hCoreCoder[0]->bwidth > WB && last_bwidth == WB && hCPE->hCoreCoder[0]->ini_frame > 1 /* counter wass already updated */ ) + { + /* fad-in reference HB signal */ + winSlope = ( memOffset > 0 ) ? ( 1.0f / memOffset ) : 0; + for ( i = 0; i < memOffset; i++ ) + { + outputHB[refChanIndx_bwe][i] *= ( i + 1 ) * winSlope; + } + } + /* Resampled LB and HB offset */ + mvr2r( outputHB[refChanIndx_bwe], temp0 + memOffset, output_frame - memOffset ); + mvr2r( outputHB[!refChanIndx_bwe], temp1 + memOffset, output_frame - memOffset ); + + decoderDelay = NS2SA( output_Fs, IVAS_DEC_DELAY_NS ); + + if ( last_core != ACELP_CORE && hCPE->element_mode == IVAS_CPE_DFT ) + { + /* hb_synth of mid band is faded out in the 1.25 ms prior to DFT analysis and the icbwe is faded in time domain */ + icbweOLASize = NS2SA( output_Fs, STEREO_DFT_DELAY_DEC_BWE_NS ); + + for ( i = 0; i < decoderDelay; i++ ) + { + temp0[i] = 0; + temp1[i] = 0; + } + + assert( icbweOLASize > 0 ); + winSlope = 1.0f / icbweOLASize; + alpha = winSlope; + for ( ; i < decoderDelay + icbweOLASize; i++ ) + { + temp0[i] *= alpha; + temp1[i] *= alpha; + alpha += winSlope; + } + } + else + { + if ( refChanIndx_bwe != hStereoICBWE->prev_refChanIndx_bwe ) + { + winSlope = ( memOffset > 0 ) ? ( 1.0f / memOffset ) : 0; + for ( i = 0; i < memOffset; i++ ) + { + temp0[i] = ( ( i + 1 ) * winSlope ) * hStereoICBWE->memOutHB[refChanIndx_bwe][i] + + ( 1 - ( i + 1 ) * winSlope ) * hStereoICBWE->memOutHB[hStereoICBWE->prev_refChanIndx_bwe][i]; + temp1[i] = ( ( i + 1 ) * winSlope ) * hStereoICBWE->memOutHB[hStereoICBWE->prev_refChanIndx_bwe][i] + + ( 1 - ( i + 1 ) * winSlope ) * hStereoICBWE->memOutHB[refChanIndx_bwe][i]; + } + } + else + { + mvr2r( hStereoICBWE->memOutHB[refChanIndx_bwe], temp0, memOffset ); + mvr2r( hStereoICBWE->memOutHB[!refChanIndx_bwe], temp1, memOffset ); + } + } + + if ( hCPE->nchan_out == 1 ) + { + /* stereo to mono downmix */ + for ( i = 0; i < output_frame; i++ ) + { + temp0[i] = ( temp0[i] + temp1[i] ) * 0.5f; + output[0][i] += temp0[i]; + } + } + else + { + + v_add( temp0, output[0], output[0], output_frame ); + v_add( temp1, output[1], output[1], output_frame ); + } + mvr2r( outputHB[0] + output_frame - memOffset, hStereoICBWE->memOutHB[0], memOffset ); + mvr2r( outputHB[1] + output_frame - memOffset, hStereoICBWE->memOutHB[1], memOffset ); + + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + win_dft = hCPE->hStereoDft->win32ms; + dftOvlLen = hCPE->hStereoDft->dft32ms_ovl; + + /* Preparing buffers in anticipation of an ACELP to TCX switch */ + j = 0; + for ( i = 0; i < memOffset; i++ ) + { + hStereoICBWE->memTransitionHB[0][i] = hStereoICBWE->memOutHB[0][i] * win_dft[STEREO_DFT32MS_STEP * ( dftOvlLen - 1 - j )]; + hStereoICBWE->memTransitionHB[1][i] = hStereoICBWE->memOutHB[1][i] * win_dft[STEREO_DFT32MS_STEP * ( dftOvlLen - 1 - j )]; + j++; + } + + for ( i = 0; j < dftOvlLen; i++ ) + { + hStereoICBWE->memTransitionHB[0][memOffset + i] = outputHB[0][output_frame - i - 1] * win_dft[STEREO_DFT32MS_STEP * ( dftOvlLen - 1 - j )]; + hStereoICBWE->memTransitionHB[1][memOffset + i] = outputHB[1][output_frame - i - 1] * win_dft[STEREO_DFT32MS_STEP * ( dftOvlLen - 1 - j )]; + j++; + } + } + + hStereoICBWE->prev_refChanIndx_bwe = refChanIndx_bwe; + } + else + { + if ( last_core == ACELP_CORE ) + { + if ( hCPE->element_mode == IVAS_CPE_TD ) + { + v_add( output[0], hStereoICBWE->memOutHB[hStereoICBWE->prev_refChanIndx_bwe], output[0], memOffset ); + v_add( output[1], hStereoICBWE->memOutHB[!hStereoICBWE->prev_refChanIndx_bwe], output[1], memOffset ); + } + else + { + /* This is generated in the ACELP frame and windowed. This process is akin to GenTransition for IC-BWE */ + v_add( output[0], hStereoICBWE->memTransitionHB[hStereoICBWE->prev_refChanIndx_bwe], output[0], NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + v_add( output[1], hStereoICBWE->memTransitionHB[!hStereoICBWE->prev_refChanIndx_bwe], output[1], NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + } + + set_f( hStereoICBWE->memOutHB[0], 0, memOffset ); + set_f( hStereoICBWE->memOutHB[1], 0, memOffset ); + + set_f( hStereoICBWE->memTransitionHB[0], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + set_f( hStereoICBWE->memTransitionHB[1], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + } + } + } + else if ( hCPE->element_mode == IVAS_CPE_TD && hCPE->hCoreCoder[0]->tdm_LRTD_flag && hStereoICBWE != NULL ) + { + stereo_icBWE_init_dec( hCPE->hStereoICBWE ); + } + else if ( hCPE->element_mode == IVAS_CPE_MDCT && hCPE->last_element_mode == IVAS_CPE_DFT && last_core == ACELP_CORE ) + { + int16_t delay_tdbwe = NS2SA( output_Fs, DELAY_BWE_TOTAL_NS ); + + for ( n = 0; n < hCPE->nchan_out; n++ ) + { + for ( i = 0; i < delay_tdbwe; i++ ) + { + output[n][NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) - delay_tdbwe + i] += outputHB[0][i]; + } + } + /* reset BWE structs as they are only needed in the transition frame in MDCT Stereo */ + td_bwe_dec_init( hCPE->hCoreCoder[0]->hBWE_TD, -1, output_Fs ); + + fd_bwe_dec_init_flt( hCPE->hCoreCoder[0]->hBWE_FD ); + } + + if ( hCPE->element_mode == IVAS_CPE_DFT && ( max( hCPE->hStereoDft->td_gain[0], hCPE->hStereoDft->td_gain[1] ) > 0 ) ) + { + float win_in, win_out, tmp; + + win_dft = hCPE->hStereoDft->win32ms; + dftOvlLen = hCPE->hStereoDft->dft32ms_ovl; + + for ( i = 0; i < dftOvlLen; i++ ) + { + win_in = win_dft[STEREO_DFT32MS_STEP * i] * win_dft[STEREO_DFT32MS_STEP * i]; + win_out = 1 - win_in; + tmp = ( win_in * hCPE->hStereoDft->td_gain[0] + win_out * hCPE->hStereoDft->td_gain[1] ) * hCPE->hStereoDft->hb_stefi_sig[i]; + + output[0][i] += tmp; + output[1][i] -= tmp; + } + for ( i = dftOvlLen; i < output_frame; i++ ) + { + tmp = hCPE->hStereoDft->td_gain[0] * hCPE->hStereoDft->hb_stefi_sig[i]; + output[0][i] += tmp; + output[1][i] -= tmp; + } + } + + return; +} +#else +void stereo_icBWE_decproc_fx( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word32 *output[CPE_CHANNELS], /* i/o: output synthesis */ + Word32 outputHB[CPE_CHANNELS][L_FRAME48k], /* i : HB synthesis */ + const Word16 last_core, /* i : last core, primary channel */ + const Word16 last_bwidth, /* i : last bandwidth */ + const Word16 output_frame /* i : frame length */ +#ifndef FIX_826_PRECISION_LOST_AND_COMPL + , + Word16 q_output /* i : Q-fac of output */ +#endif +) +{ + Word16 i, j, n, decoderDelay, icbweOLASize, dftOvlLen; + Word16 core, memOffset, refChanIndx_bwe; + + Word32 temp0_fx[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )], temp1_fx[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )]; +#if defined FIX_826_PRECISION_LOST_AND_COMPL + Word16 winSlope_fx = 0, alpha_fx; +#else + Word32 winSlope_fx = 0, alpha_fx; +#endif + move32(); + const Word16 *win_dft_fx; + Word32 extl_brate, output_Fs; + + STEREO_ICBWE_DEC_HANDLE hStereoICBWE = hCPE->hStereoICBWE; + + /*--------------------------------------------------------------------* + * skip IC-BWE in case of SID or NO_DATA frame + * -------------------------------------------------------------------*/ + + test(); + test(); + test(); + IF( ( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) || EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) && EQ_16( hCPE->nchan_out, 2 ) /*&& hCPE->hCoreCoder[0]->core_brate > SID_2k40*/ && LE_32( hCPE->hCoreCoder[0]->last_core_brate, SID_2k40 ) ) + { + stereo_icBWE_init_dec_fx( hCPE->hStereoICBWE ); + } + + IF( LE_32( hCPE->hCoreCoder[0]->core_brate, SID_2k40 ) ) + { + return; + } + + /*--------------------------------------------------------------------* + * skip IC-BWE in case of mono DMX output * + * -------------------------------------------------------------------*/ + + test(); + test(); + IF( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) + { + add_HB_to_mono_dmx_fx( hCPE, output[0], outputHB[0], last_core, output_frame ); + return; + } + ELSE IF( EQ_16( hCPE->nchan_out, 1 ) && NE_16( hCPE->element_mode, IVAS_CPE_TD ) ) + { + return; + } + + /*--------------------------------------------------------------------* + * IC-BWE processing + * -------------------------------------------------------------------*/ + + core = hCPE->hCoreCoder[0]->core; + move16(); + extl_brate = hCPE->hCoreCoder[0]->extl_brate; + move32(); + output_Fs = hCPE->hCoreCoder[0]->output_Fs; + move32(); + + memOffset = NS2SA( output_Fs, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); + + /* LRTD stereo mode - 2xBWEs used */ + test(); + IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && hCPE->hCoreCoder[0]->tdm_LRTD_flag ) + { + /* delay HB synth */ + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + Copy32( outputHB[n] + output_frame - memOffset, temp0_fx, memOffset ); + Copy32( outputHB[n], outputHB[n] + memOffset, output_frame - memOffset ); + Copy32( hCPE->prev_hb_synth_fx[n], outputHB[n], memOffset ); + Copy32( temp0_fx, hCPE->prev_hb_synth_fx[n], memOffset ); + } + + IF( EQ_16( hCPE->nchan_out, 1 ) ) + { + /* stereo to mono downmix */ + FOR( i = 0; i < output_frame; i++ ) + { +#ifdef FIX_826_PRECISION_LOST_AND_COMPL + outputHB[0][i] = W_extract_h( W_mac_32_16( W_mult_32_16( outputHB[0][i], 16384 ), outputHB[1][i], 16384 ) ); +#else + outputHB[0][i] = L_shr( ( outputHB[0][i] + outputHB[1][i] ), 1 ); +#endif + move32(); + } + v_add_32( output[0], outputHB[0], output[0], output_frame ); + } + ELSE + { + /* Add the delayed hb_synth component to the delayed ACELP synthesis */ + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + v_add_32( output[n], outputHB[n], output[n], output_frame ); + } + } + } + ELSE + { + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + set32_fx( hCPE->prev_hb_synth_fx[n], 0, memOffset ); + } + } + + test(); + test(); + test(); + test(); + test(); + test(); + IF( NE_16( hCPE->element_mode, IVAS_CPE_MDCT ) && !( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && hCPE->hCoreCoder[0]->tdm_LRTD_flag ) ) + { + IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) ) + { + set32_fx( hStereoICBWE->memOutHB_fx[0], 0, memOffset ); + set32_fx( hStereoICBWE->memOutHB_fx[1], 0, memOffset ); + + set32_fx( hStereoICBWE->memTransitionHB_fx[0], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + set32_fx( hStereoICBWE->memTransitionHB_fx[1], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + } + + test(); + IF( EQ_16( core, ACELP_CORE ) && extl_brate > 0 ) + { + refChanIndx_bwe = hStereoICBWE->refChanIndx_bwe; + move16(); + + test(); + test(); + test(); + IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && GT_16( hCPE->hCoreCoder[0]->bwidth, WB ) && EQ_16( last_bwidth, WB ) && GT_16( hCPE->hCoreCoder[0]->ini_frame, 1 ) /* counter wass already updated */ ) + { + /* fad-in reference HB signal */ + IF( GT_16( memOffset, 0 ) ) + { + SWITCH( memOffset ) + { +#if defined FIX_826_PRECISION_LOST_AND_COMPL + case 15: + winSlope_fx = 2185; + move32(); + BREAK; + case 30: + winSlope_fx = 1092; + move32(); + BREAK; + case 45: + winSlope_fx = 728; + move32(); + BREAK; +#else + case 15: + winSlope_fx = 71582792; + move32(); + BREAK; + case 30: + winSlope_fx = 35791396; + move32(); + BREAK; + case 45: + winSlope_fx = 23860930; + move32(); + BREAK; +#endif + } + // memOffset for 16K 32K 48K are 15 30 45 respectively.camera + } + ELSE + { + winSlope_fx = 0; + move32(); + } +#if defined FIX_826_PRECISION_LOST_AND_COMPL + alpha_fx = 0; + move16(); +#endif + FOR( i = 0; i < memOffset; i++ ) + { +#if defined FIX_826_PRECISION_LOST_AND_COMPL + alpha_fx = add_sat( alpha_fx, winSlope_fx ); + outputHB[refChanIndx_bwe][i] = W_round48_L( W_mult_32_16( outputHB[refChanIndx_bwe][i] /* Q11 + Q15 + 1 - 16 = Q11)*/, winSlope_fx ) ); // +#else + Word32 mul_win = Mpy_32_16_1( winSlope_fx, ( i + 1 ) ); // Q30 + Q0 - 15 = Q15 + mul_win = L_shl( mul_win, 15 ); // Q30 + outputHB[refChanIndx_bwe][i] = L_shl( Mpy_32_32( outputHB[refChanIndx_bwe][i] /* Q11 + Q30 - 31 = Q10)*/, mul_win ), 1 ); // +#endif + move32(); + } + } + /* Resampled LB and HB offset */ + Copy32( outputHB[refChanIndx_bwe], temp0_fx + memOffset, sub( output_frame, memOffset ) ); + Copy32( outputHB[!refChanIndx_bwe], temp1_fx + memOffset, sub( output_frame, memOffset ) ); + + decoderDelay = NS2SA( output_Fs, IVAS_DEC_DELAY_NS ); + + test(); + IF( last_core != ACELP_CORE && EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) + { + /* hb_synth of mid band is faded out in the 1.25 ms prior to DFT analysis and the icbwe is faded in time domain */ + icbweOLASize = NS2SA( output_Fs, STEREO_DFT_DELAY_DEC_BWE_NS ); + + FOR( i = 0; i < decoderDelay; i++ ) + { + temp0_fx[i] = 0; + move32(); + temp1_fx[i] = 0; + move32(); + } + + assert( icbweOLASize > 0 ); + SWITCH( icbweOLASize ) + { +#if defined FIX_826_PRECISION_LOST_AND_COMPL + case 60: + winSlope_fx = 546; + move16(); + BREAK; + case 40: + winSlope_fx = 819; + move16(); + BREAK; + case 20: + winSlope_fx = 1638; + move16(); + BREAK; + default: + fprintf( stderr, "icbweOLASize of size %d not implemented \n", icbweOLASize ); + assert( 0 ); + BREAK; +#else + case 60: + winSlope_fx = 17895698; + move32(); + BREAK; + case 40: + winSlope_fx = 26843546; + move32(); + BREAK; + case 20: + winSlope_fx = 53687092; + move32(); + BREAK; +#endif + } + alpha_fx = winSlope_fx; // Q30 + move32(); + FOR( ; i < add( decoderDelay, icbweOLASize ); i++ ) + { +#if defined FIX_826_PRECISION_LOST_AND_COMPL + temp0_fx[i] = W_round48_L( W_mult_32_16( temp0_fx[i], alpha_fx ) ); // Q11 + move32(); + temp1_fx[i] = W_round48_L( W_mult_32_16( temp1_fx[i], alpha_fx ) ); + move32(); + alpha_fx = add_sat( alpha_fx, winSlope_fx ); +#else + temp0_fx[i] = L_shl_sat( Mpy_32_32( temp0_fx[i], alpha_fx ), 1 ); // Q11 + move32(); + temp1_fx[i] = L_shl_sat( Mpy_32_32( temp1_fx[i], alpha_fx ), 1 ); + move32(); + alpha_fx = L_add( alpha_fx, winSlope_fx ); +#endif + } + } + ELSE + { + IF( NE_16( refChanIndx_bwe, hStereoICBWE->prev_refChanIndx_bwe ) ) + { + IF( memOffset > 0 ) + { + SWITCH( memOffset ) + { +#if defined FIX_826_PRECISION_LOST_AND_COMPL + case 15: + winSlope_fx = 2185; + move16(); + BREAK; + case 30: + winSlope_fx = 1092; + move16(); + BREAK; + case 45: + winSlope_fx = 728; + move16(); + BREAK; +#else + case 15: + winSlope_fx = 71582792; + move32(); + BREAK; + case 30: + winSlope_fx = 35791396; + move32(); + BREAK; + case 45: + winSlope_fx = 23860930; // Q30 + move32(); + BREAK; +#endif + } + // memOffset for 16K 32K 48K are 15 30 45 respectively.camera + } + ELSE + { + winSlope_fx = 0; + move32(); + } +#if defined FIX_826_PRECISION_LOST_AND_COMPL + Word16 Incr = 0; + Word16 Decr = MAX_16; +#endif + move16(); + move16(); + FOR( i = 0; i < memOffset; i++ ) + { +#ifndef FIX_826_PRECISION_LOST_AND_COMPL + temp0_fx[i] = L_add( L_shl( Mpy_32_32( Mpy_32_16_1( winSlope_fx, ( i + 1 ) ), hStereoICBWE->memOutHB_fx[refChanIndx_bwe][i] ), 16 ), + L_shl( Mpy_32_32( Mpy_32_16_1( winSlope_fx, 1 - ( i + 1 ) ), hStereoICBWE->memOutHB_fx[hStereoICBWE->prev_refChanIndx_bwe][i] ), 16 ) ); + move32(); + + temp1_fx[i] = L_add( L_shl( Mpy_32_32( Mpy_32_16_1( winSlope_fx, ( i + 1 ) ), hStereoICBWE->memOutHB_fx[hStereoICBWE->prev_refChanIndx_bwe][i] ), 16 ), + L_shl( Mpy_32_32( Mpy_32_16_1( winSlope_fx, ( 1 - ( i + 1 ) ) ), hStereoICBWE->memOutHB_fx[refChanIndx_bwe][i] ), 16 ) ); +#else + Incr = add_sat( Incr, winSlope_fx ); + Decr = sub( Decr, winSlope_fx ); + temp0_fx[i] = W_round48_L( W_mac_32_16( W_mult_32_16( hStereoICBWE->memOutHB_fx[refChanIndx_bwe][i], Incr ), hStereoICBWE->memOutHB_fx[hStereoICBWE->prev_refChanIndx_bwe][i], Decr ) ); + temp1_fx[i] = W_round48_L( W_mac_32_16( W_mult_32_16( hStereoICBWE->memOutHB_fx[hStereoICBWE->prev_refChanIndx_bwe][i], Incr ), hStereoICBWE->memOutHB_fx[refChanIndx_bwe][i], Decr ) ); +#endif + move32(); + } + } + ELSE + { + Copy32( hStereoICBWE->memOutHB_fx[refChanIndx_bwe], temp0_fx, memOffset ); + Copy32( hStereoICBWE->memOutHB_fx[!refChanIndx_bwe], temp1_fx, memOffset ); + } + } + + IF( EQ_16( hCPE->nchan_out, 1 ) ) + { +#ifdef FIX_826_PRECISION_LOST_AND_COMPL + Word64 W_tmp; +#endif + /* stereo to mono downmix */ + FOR( i = 0; i < output_frame; i++ ) + { +#ifndef FIX_826_PRECISION_LOST_AND_COMPL + temp0_fx[i] = L_add( temp0_fx[i], temp1_fx[i] ); + move32(); + temp0_fx[i] = L_shr( temp0_fx[i], 1 ); + move32(); + output[0][i] = L_add( output[0][i], temp0_fx[i] ); +#else + W_tmp = W_mult_32_16( output[0][i], 32767 ); + W_tmp = W_mac_32_16( W_tmp, temp0_fx[i], 16384 ); + output[0][i] = W_round48_L( W_mac_32_16( W_tmp, temp1_fx[i], 16384 ) ); + move32(); + +#endif + move32(); + } + } + ELSE + { + v_add_32( temp0_fx, output[0], output[0], output_frame ); + v_add_32( temp1_fx, output[1], output[1], output_frame ); + } + + Copy32( outputHB[0] + output_frame - memOffset, hStereoICBWE->memOutHB_fx[0], memOffset ); + Copy32( outputHB[1] + output_frame - memOffset, hStereoICBWE->memOutHB_fx[1], memOffset ); + + IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) + { + /*win_dft = hCPE->hStereoDft->win32ms;*/ + win_dft_fx = hCPE->hStereoDft->win32ms_fx; + dftOvlLen = hCPE->hStereoDft->dft32ms_ovl; + move16(); + + /* Preparing buffers in anticipation of an ACELP to TCX switch */ + +#ifndef FIX_826_PRECISION_LOST_AND_COMPL + j = 0; + move16(); +#else + j = sub( dftOvlLen, 1 ); +#endif + FOR( i = 0; i < memOffset; i++ ) + { +#ifndef FIX_826_PRECISION_LOST_AND_COMPL + Word16 tmp_mul = mult0( STEREO_DFT32MS_STEP, ( sub( dftOvlLen, add( 1, j ) ) ) ); + hStereoICBWE->memTransitionHB_fx[0][i] = Mpy_32_16_1( hStereoICBWE->memOutHB_fx[0][i], win_dft_fx[tmp_mul] ); + move32(); + hStereoICBWE->memTransitionHB_fx[1][i] = Mpy_32_16_1( hStereoICBWE->memOutHB_fx[1][i], win_dft_fx[tmp_mul] ); + move32(); + j = add( j, 1 ); +#else + Word16 tmp_mul = i_mult( STEREO_DFT32MS_STEP, j ); + hStereoICBWE->memTransitionHB_fx[0][i] = Mpy_32_16_1( hStereoICBWE->memOutHB_fx[0][i], win_dft_fx[tmp_mul] ); + move32(); + hStereoICBWE->memTransitionHB_fx[1][i] = Mpy_32_16_1( hStereoICBWE->memOutHB_fx[1][i], win_dft_fx[tmp_mul] ); + move32(); + j = sub( j, 1 ); +#endif + } + +#if !defined FIX_826_PRECISION_LOST_AND_COMPL || defined FIX_833_CORRECTION_to_826 + FOR( i = 0; j < dftOvlLen; i++ ) +#else + FOR( i = 0; i < dftOvlLen; i++ ) +#endif + { +#if !defined FIX_826_PRECISION_LOST_AND_COMPL || defined FIX_833_CORRECTION_to_826 + Word16 tmp_mul = mult0( STEREO_DFT32MS_STEP, ( sub( dftOvlLen, add( 1, j ) ) ) ); + hStereoICBWE->memTransitionHB_fx[0][memOffset + i] = Mpy_32_16_1( outputHB[0][output_frame - i - 1], win_dft_fx[tmp_mul] ); + move32(); + hStereoICBWE->memTransitionHB_fx[1][memOffset + i] = Mpy_32_16_1( outputHB[1][output_frame - i - 1], win_dft_fx[tmp_mul] ); + move32(); + j = add( j, 1 ); +#else + Word16 tmp_mul = i_mult( STEREO_DFT32MS_STEP, j ); + hStereoICBWE->memTransitionHB_fx[0][memOffset + i] = Mpy_32_16_1( outputHB[0][output_frame - i - 1], win_dft_fx[tmp_mul] ); + move32(); + hStereoICBWE->memTransitionHB_fx[1][memOffset + i] = Mpy_32_16_1( outputHB[1][output_frame - i - 1], win_dft_fx[tmp_mul] ); + move32(); + j = sub( j, 1 ); +#endif + } + } + + hStereoICBWE->prev_refChanIndx_bwe = refChanIndx_bwe; + move16(); + } + ELSE + { + IF( last_core == ACELP_CORE ) + { + IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) ) + { + v_add_32( output[0], hStereoICBWE->memOutHB_fx[hStereoICBWE->prev_refChanIndx_bwe], output[0], memOffset ); + v_add_32( output[1], hStereoICBWE->memOutHB_fx[!hStereoICBWE->prev_refChanIndx_bwe], output[1], memOffset ); + } + ELSE + { + /* This is generated in the ACELP frame and windowed. This process is akin to GenTransition for IC-BWE */ + v_add_32( output[0], hStereoICBWE->memTransitionHB_fx[hStereoICBWE->prev_refChanIndx_bwe], output[0], NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + v_add_32( output[1], hStereoICBWE->memTransitionHB_fx[!hStereoICBWE->prev_refChanIndx_bwe], output[1], NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + } + + set32_fx( hStereoICBWE->memOutHB_fx[0], 0, memOffset ); + set32_fx( hStereoICBWE->memOutHB_fx[1], 0, memOffset ); + + set32_fx( hStereoICBWE->memTransitionHB_fx[0], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + set32_fx( hStereoICBWE->memTransitionHB_fx[1], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + } + } + } + ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && hCPE->hCoreCoder[0]->tdm_LRTD_flag && hStereoICBWE != NULL ) + { + stereo_icBWE_init_dec_fx( hCPE->hStereoICBWE ); + } + ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) && EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) && EQ_16( last_core, ACELP_CORE ) ) + { + Word16 delay_tdbwe = NS2SA( output_Fs, DELAY_BWE_TOTAL_NS ); + + FOR( n = 0; n < hCPE->nchan_out; n++ ) + { + FOR( i = 0; i < delay_tdbwe; i++ ) + { + output[n][NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) - delay_tdbwe + i] = L_add_sat( output[n][NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) - delay_tdbwe + i], outputHB[0][i] ); + move32(); + } + } + /* reset BWE structs as they are only needed in the transition frame in MDCT Stereo */ + td_bwe_dec_init_ivas_fx( hCPE->hCoreCoder[0], hCPE->hCoreCoder[0]->hBWE_TD, output_Fs ); + fd_bwe_dec_init( hCPE->hCoreCoder[0], hCPE->hCoreCoder[0]->hBWE_FD ); + } + + test(); + IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && GT_32( L_max( hCPE->hStereoDft->td_gain_fx[0], hCPE->hStereoDft->td_gain_fx[1] ), 0 ) ) + { +#ifdef FIX_826_PRECISION_LOST_AND_COMPL + Word32 win_in_fx, win_out_fx, tmp_fx; + Word64 W_tmp, W_tmp1; +#else + Word32 win_in_fx, win_out_fx, tmp_fx, gain0_fx, gain1_fx; +#endif + win_dft_fx = hCPE->hStereoDft->win32ms_fx; + dftOvlLen = hCPE->hStereoDft->dft32ms_ovl; + move16(); + + // Scale_sig32(hCPE->hStereoDft->td_gain_fx, STEREO_DFT_CORE_HIST_MAX, -12); + + FOR( i = 0; i < dftOvlLen; i++ ) + { +#ifdef FIX_826_PRECISION_LOST_AND_COMPL + j = i_mult( STEREO_DFT32MS_STEP, i ); + win_in_fx = L_mult( win_dft_fx[j], win_dft_fx[j] ); /* Q31 */ + win_out_fx = L_sub( ONE_IN_Q31, win_in_fx ); /* Q31 */ + /* hCPE->hStereoDft->q_hb_stefi_sig_fx is always 31 here */ + /* tmp = ( win_in * hCPE->hStereoDft->td_gain[0] + win_out * hCPE->hStereoDft->td_gain[1] ) * hCPE->hStereoDft->hb_stefi_sig[i]; */ + + W_tmp = W_mult_32_32( hCPE->hStereoDft->td_gain_fx[0], win_in_fx ); + if ( hCPE->hStereoDft->q_td_gain[0] != 0 ) + { + W_tmp = W_shl( W_tmp, sub( 31, hCPE->hStereoDft->q_td_gain[0] ) ); + } + W_tmp1 = W_mult_32_32( hCPE->hStereoDft->td_gain_fx[1], win_out_fx ); + if ( hCPE->hStereoDft->q_td_gain[1] != 0 ) + { + W_tmp1 = W_shl( W_tmp1, sub( 31, hCPE->hStereoDft->q_td_gain[1] ) ); + } + tmp_fx = W_extract_h( W_add_nosat( W_tmp, W_tmp1 ) ); + tmp_fx = W_extract_h( W_mult_32_32( tmp_fx, hCPE->hStereoDft->hb_stefi_sig_fx[i] ) ); + + output[0][i] = L_add_sat( output[0][i], tmp_fx ); + move32(); + output[1][i] = L_sub_sat( output[1][i], tmp_fx ); + move32(); +#else + win_in_fx = L_mult( win_dft_fx[mult0( STEREO_DFT32MS_STEP, i )], win_dft_fx[mult0( STEREO_DFT32MS_STEP, i )] ); /* Q31 */ + win_out_fx = L_sub( ONE_IN_Q31, win_in_fx ); /* Q31 */ + + gain0_fx = Mpy_32_32( win_in_fx, hCPE->hStereoDft->td_gain_fx[0] ); /* Q --> q_td_gain[0] */ +#ifdef FIX_736_BWE_SECT_C + gain0_fx = (Word32) W_shr( ( (Word64) gain0_fx * hCPE->hStereoDft->hb_stefi_sig_fx[i] ), sub( add( (Word16) hCPE->hStereoDft->q_td_gain[0], hCPE->hStereoDft->q_hb_stefi_sig_fx ), 2 * q_output + 14 ) ); /* Q --> q_output */ + gain1_fx = Mpy_32_32( win_out_fx, hCPE->hStereoDft->td_gain_fx[1] ); /* Q --> q_td_gain[1] */ + gain1_fx = (Word32) W_shr( ( (Word64) gain1_fx * hCPE->hStereoDft->hb_stefi_sig_fx[i] ), sub( add( (Word16) hCPE->hStereoDft->q_td_gain[1], hCPE->hStereoDft->q_hb_stefi_sig_fx ), 2 * q_output + 14 ) ); /* Q --> q_output */ +#else + gain0_fx = (Word32) W_shr( ( (Word64) gain0_fx * hCPE->hStereoDft->hb_stefi_sig_fx[i] ), sub( add( (Word16) hCPE->hStereoDft->q_td_gain[0], hCPE->hStereoDft->q_hb_stefi_sig_fx ), q_output ) ); /* Q --> q_output */ + gain1_fx = Mpy_32_32( win_out_fx, hCPE->hStereoDft->td_gain_fx[1] ); /* Q --> q_td_gain[1] */ + gain1_fx = (Word32) W_shr( ( (Word64) gain1_fx * hCPE->hStereoDft->hb_stefi_sig_fx[i] ), sub( add( (Word16) hCPE->hStereoDft->q_td_gain[1], hCPE->hStereoDft->q_hb_stefi_sig_fx ), q_output ) ); /* Q --> q_output */ +#endif + tmp_fx = L_add_sat( gain0_fx, gain1_fx ); /* Q --> q_output */ + + output[0][i] = L_add_sat( output[0][i], tmp_fx ); + move32(); + output[1][i] = L_sub_sat( output[1][i], tmp_fx ); + move32(); +#endif + } + FOR( i = dftOvlLen; i < output_frame; i++ ) + { +#ifdef FIX_826_PRECISION_LOST_AND_COMPL + tmp_fx = W_extract_h( W_mult_32_32( hCPE->hStereoDft->td_gain_fx[0], hCPE->hStereoDft->hb_stefi_sig_fx[i] ) ); /* Q11 --> Q11 */ +#else +#ifdef FIX_736_BWE_SECT_C + tmp_fx = (Word32) W_shr( ( (Word64) hCPE->hStereoDft->td_gain_fx[0] * hCPE->hStereoDft->hb_stefi_sig_fx[i] ), sub( add( (Word16) hCPE->hStereoDft->q_td_gain[0], hCPE->hStereoDft->q_hb_stefi_sig_fx ), 2 * q_output + 14 ) ); /* Q --> q_output */ +#else + tmp_fx = (Word32) W_shr( ( (Word64) hCPE->hStereoDft->td_gain_fx[0] * hCPE->hStereoDft->hb_stefi_sig_fx[i] ), sub( add( (Word16) hCPE->hStereoDft->q_td_gain[0], hCPE->hStereoDft->q_hb_stefi_sig_fx ), q_output ) ); /* Q --> q_output */ +#endif +#endif + output[0][i] = L_add_sat( output[0][i], tmp_fx ); + move32(); + output[1][i] = L_sub_sat( output[1][i], tmp_fx ); + move32(); + } + } + + return; +} +#endif + +/*-------------------------------------------------------------------* + * stereo_icBWE_init_dec() + * + * Stereo (inter-channel) BWE mapping - decoder initialization + *-------------------------------------------------------------------*/ + +#ifndef IVAS_FLOAT_FIXED +void stereo_icBWE_init_dec( + STEREO_ICBWE_DEC_HANDLE hStereoICBWE /* i/o: Stereo inter-channel BWE handle */ +) +{ + /* BWE ref channel */ + hStereoICBWE->refChanIndx_bwe = L_CH_INDX; + hStereoICBWE->prev_refChanIndx_bwe = L_CH_INDX; + + /* SHB output memory */ + set_f( hStereoICBWE->memOutHB[0], 0, NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) ); + set_f( hStereoICBWE->memOutHB[1], 0, NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) ); + + + /* SHB output memory */ + set_f( hStereoICBWE->memTransitionHB[0], 0, NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) ); + set_f( hStereoICBWE->memTransitionHB[1], 0, NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) ); + + /* inter-channel BWE spectral shape adj. */ + hStereoICBWE->prevSpecMapping = 0; + hStereoICBWE->prevgsMapping = 1.0f; + + hStereoICBWE->icbweM2Ref_prev = 1.0f; + + hStereoICBWE->prev_spIndx = 0; + hStereoICBWE->prev_gsIndx = 0; + + ic_bwe_dec_reset( hStereoICBWE ); + return; +} +#else +void stereo_icBWE_init_dec_fx( + STEREO_ICBWE_DEC_HANDLE hStereoICBWE /* i/o: Stereo inter-channel BWE handle */ +) +{ + /* BWE ref channel */ + hStereoICBWE->refChanIndx_bwe = L_CH_INDX; + move16(); + hStereoICBWE->prev_refChanIndx_bwe = L_CH_INDX; + move16(); + + /* SHB output memory */ + set32_fx( hStereoICBWE->memOutHB_fx[0], 0, NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) ); + set32_fx( hStereoICBWE->memOutHB_fx[1], 0, NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) ); + + + /* SHB output memory */ + set32_fx( hStereoICBWE->memTransitionHB_fx[0], 0, NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) ); + set32_fx( hStereoICBWE->memTransitionHB_fx[1], 0, NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) ); + + /* inter-channel BWE spectral shape adj. */ + hStereoICBWE->prevSpecMapping_fx = 0; + move16(); + hStereoICBWE->prevgsMapping_fx = 16384; + move16(); + hStereoICBWE->icbweM2Ref_prev_fx = 16384; + move16(); + + hStereoICBWE->prev_spIndx = 0; + move16(); + hStereoICBWE->prev_gsIndx = 0; + move16(); + + ic_bwe_dec_reset_fx( hStereoICBWE ); + + return; +} +#endif diff --git a/lib_enc/igf_enc_fx.c b/lib_enc/igf_enc_fx.c index 61b844fde..be687de6d 100644 --- a/lib_enc/igf_enc_fx.c +++ b/lib_enc/igf_enc_fx.c @@ -13,6 +13,7 @@ #include "prot_fx_enc.h" /* Function prototypes */ #include "stat_enc.h" #include "basop_util.h" +/*AddedByWMC_Tool*/#include "wmc_auto.h" /**********************************************************************/ /* write single bit to stream -- GitLab From 965b71d03a319b333d9e33ce8f51ddc547bb86e2 Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Wed, 7 Aug 2024 09:06:12 -0400 Subject: [PATCH 2/3] Revert "FIX 833 to fix issue introduced in 826" because of projects modifications This reverts commit 7df987bb9cfc6a0cbd4c1e119a9c021c3e8b8c8c. --- Workspace_msvc/decoder.vcxproj | 344 +- Workspace_msvc/encoder.vcxproj | 354 +- Workspace_msvc/lib_com.vcxproj | 840 ++-- Workspace_msvc/lib_debug.vcxproj | 240 +- Workspace_msvc/lib_dec.vcxproj | 936 ++--- Workspace_msvc/lib_dec.vcxproj.filters | 609 ++- Workspace_msvc/lib_enc.vcxproj | 1010 ++--- Workspace_msvc/lib_rend.vcxproj | 414 +- Workspace_msvc/lib_rend.vcxproj.filters | 311 +- Workspace_msvc/lib_util.vcxproj | 312 +- Workspace_msvc/renderer.vcxproj | 358 +- lib_com/options.h | 3 - lib_dec/ivas_stereo_icbwe_dec.c | 4756 +++++++++++------------ lib_enc/igf_enc_fx.c | 1 - 14 files changed, 5243 insertions(+), 5245 deletions(-) diff --git a/Workspace_msvc/decoder.vcxproj b/Workspace_msvc/decoder.vcxproj index c88edac1f..ca0d96f44 100644 --- a/Workspace_msvc/decoder.vcxproj +++ b/Workspace_msvc/decoder.vcxproj @@ -1,173 +1,173 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - decoder - {E3DCBC31-7FC9-D127-E000-529F8460D5FD} - decoder - 10.0.17763.0 - - - - Application - v142 - false - MultiByte - - - Application - v142 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_dec - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_dec - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - true - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - libcmtd.lib - - - - - - - - - - {e822ddaf-0f5f-4cd0-a694-38ae69de74d3} - false - - - {2fa8f384-0775-f3b7-f8c3-85209222fc70} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + decoder + {E3DCBC31-7FC9-D127-E000-529F8460D5FD} + decoder + 10.0.17763.0 + + + + Application + v141 + false + MultiByte + + + Application + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_dec + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_dec + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + true + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_dec;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + libcmtd.lib + + + + + + + + + + {e822ddaf-0f5f-4cd0-a694-38ae69de74d3} + false + + + {2fa8f384-0775-f3b7-f8c3-85209222fc70} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/encoder.vcxproj b/Workspace_msvc/encoder.vcxproj index 3f5e39539..9578e488d 100644 --- a/Workspace_msvc/encoder.vcxproj +++ b/Workspace_msvc/encoder.vcxproj @@ -1,178 +1,178 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - encoder - {B3FC9DFC-7268-8660-7C0D-B60BAF02C554} - encoder - 10.0.17763.0 - - - - Application - v142 - false - MultiByte - - - Application - v142 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_cod - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_cod - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - false - true - $(IntDir)$(ProjectName).pdb - Console - - false - - MachineX86 - - - - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - - - - {824da4cf-06f0-45c9-929a-8792f0e19c3e} - false - - - {2fa8f384-0775-f3b7-f8c3-85209222fc70} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + encoder + {B3FC9DFC-7268-8660-7C0D-B60BAF02C554} + encoder + 10.0.17763.0 + + + + Application + v141 + false + MultiByte + + + Application + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_cod + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_cod + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + false + true + $(IntDir)$(ProjectName).pdb + Console + + false + + MachineX86 + + + + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_enc;..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + + + + {824da4cf-06f0-45c9-929a-8792f0e19c3e} + false + + + {2fa8f384-0775-f3b7-f8c3-85209222fc70} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_com.vcxproj b/Workspace_msvc/lib_com.vcxproj index 2c5fbcc2c..9119a2c38 100644 --- a/Workspace_msvc/lib_com.vcxproj +++ b/Workspace_msvc/lib_com.vcxproj @@ -1,421 +1,421 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {39EC200D-7795-4FF8-B214-B24EDA5526AE} - common - 10.0.17763.0 - - - - StaticLibrary - v142 - false - MultiByte - - - StaticLibrary - v142 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivascom - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivascom - - - - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {39EC200D-7795-4FF8-B214-B24EDA5526AE} + common + 10.0.17763.0 + + + + StaticLibrary + v141 + false + MultiByte + + + StaticLibrary + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivascom + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivascom + + + + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_debug.vcxproj b/Workspace_msvc/lib_debug.vcxproj index 89cc0a80d..929dd72a8 100644 --- a/Workspace_msvc/lib_debug.vcxproj +++ b/Workspace_msvc/lib_debug.vcxproj @@ -1,121 +1,121 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {54509728-928B-44D9-A118-A6F92F08B34F} - debug - 10.0.17763.0 - - - - StaticLibrary - v142 - MultiByte - - - StaticLibrary - v142 - MultiByte - true - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivasdebug - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivasdebug - - - - - - - Disabled - ..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;DBG_WAV_WRITER;$(Macros);%(PreprocessorDefinitions) - false - - EnableFastChecks - MultiThreadedDebug - false - $(IntDir)$(ProjectName).pdb - Level4 - OldStyle - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - MaxSpeed - AnySuitable - false - false - ..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - $(IntDir)$(ProjectName).pdb - Level4 - - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {54509728-928B-44D9-A118-A6F92F08B34F} + debug + 10.0.17763.0 + + + + StaticLibrary + v141 + MultiByte + + + StaticLibrary + v141 + MultiByte + true + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivasdebug + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivasdebug + + + + + + + Disabled + ..\lib_com;..\lib_util;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;DBG_WAV_WRITER;$(Macros);%(PreprocessorDefinitions) + false + + EnableFastChecks + MultiThreadedDebug + false + $(IntDir)$(ProjectName).pdb + Level4 + OldStyle + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + MaxSpeed + AnySuitable + false + false + ..\lib_com;..\lib_debug;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + $(IntDir)$(ProjectName).pdb + Level4 + + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_dec.vcxproj b/Workspace_msvc/lib_dec.vcxproj index 0969d22fb..d6e4a7c67 100644 --- a/Workspace_msvc/lib_dec.vcxproj +++ b/Workspace_msvc/lib_dec.vcxproj @@ -1,469 +1,469 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_dec - {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} - evs_dec - 10.0.17763.0 - - - StaticLibrary - v142 - false - MultiByte - - - - StaticLibrary - v142 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasdec - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasdec - - - - - - - .\Debug\$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - false - - - - false - - - - - - - - - - - - - - - - - - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - {718DE063-A18B-BB72-9150-62B892E6FFA6} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_dec + {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} + evs_dec + 10.0.17763.0 + + + StaticLibrary + v141 + false + MultiByte + + + + StaticLibrary + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasdec + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasdec + + + + + + + .\Debug\$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + false + + + + false + + + + + + + + + + + + + + + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + {718DE063-A18B-BB72-9150-62B892E6FFA6} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_dec.vcxproj.filters b/Workspace_msvc/lib_dec.vcxproj.filters index 22ba510ff..b9dbd7fd5 100644 --- a/Workspace_msvc/lib_dec.vcxproj.filters +++ b/Workspace_msvc/lib_dec.vcxproj.filters @@ -1,306 +1,305 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_enc.vcxproj b/Workspace_msvc/lib_enc.vcxproj index bc783ad2b..384fb8bb1 100644 --- a/Workspace_msvc/lib_enc.vcxproj +++ b/Workspace_msvc/lib_enc.vcxproj @@ -1,506 +1,506 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_enc - {824DA4CF-06F0-45C9-929A-8792F0E19C3E} - evs_enc - 10.0.17763.0 - - - - StaticLibrary - v142 - false - MultiByte - - - StaticLibrary - v142 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasenc - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasenc - - - - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_enc + {824DA4CF-06F0-45C9-929A-8792F0E19C3E} + evs_enc + 10.0.17763.0 + + + + StaticLibrary + v141 + false + MultiByte + + + StaticLibrary + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasenc + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasenc + + + + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_rend.vcxproj b/Workspace_msvc/lib_rend.vcxproj index 6a07ec09c..fa11b23be 100644 --- a/Workspace_msvc/lib_rend.vcxproj +++ b/Workspace_msvc/lib_rend.vcxproj @@ -1,208 +1,208 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - lib_rend - {718DE063-A18B-BB72-9150-62B892E6FFA6} - evs_dec - 10.0.17763.0 - - - StaticLibrary - v142 - false - MultiByte - - - - StaticLibrary - v142 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - false - false - libivasrend - - - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - false - false - libivasrend - - - - - - - .\Debug\$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - WS2_32.lib; %(AdditionalDependencies) - $(OutDir)$(TargetName).lib - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {54509728-928b-44d9-a118-a6f92f08b34f} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + lib_rend + {718DE063-A18B-BB72-9150-62B892E6FFA6} + evs_dec + 10.0.17763.0 + + + StaticLibrary + v141 + false + MultiByte + + + + StaticLibrary + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + false + false + libivasrend + + + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + false + false + libivasrend + + + + + + + .\Debug\$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);WIN32;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + WS2_32.lib; %(AdditionalDependencies) + $(OutDir)$(TargetName).lib + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {54509728-928b-44d9-a118-a6f92f08b34f} + false + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/lib_rend.vcxproj.filters b/Workspace_msvc/lib_rend.vcxproj.filters index 630e239e0..01f3dfb74 100644 --- a/Workspace_msvc/lib_rend.vcxproj.filters +++ b/Workspace_msvc/lib_rend.vcxproj.filters @@ -1,155 +1,158 @@ - - - - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - rend_c - - - - - - rend_h - - - rend_h - - - rend_h - - - rend_h - - - rend_h - - - rend_h - - - - - {54449ece-ef29-44b5-9512-ed8f555851a8} - - - {672b0eb6-cce8-425c-8bf2-aba4b45639bb} - - + + + + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + rend_c + + + + + + rend_h + + + rend_h + + + rend_h + + + rend_h + + + rend_h + + + rend_h + + + rend_h + + + + + {54449ece-ef29-44b5-9512-ed8f555851a8} + + + {672b0eb6-cce8-425c-8bf2-aba4b45639bb} + + \ No newline at end of file diff --git a/Workspace_msvc/lib_util.vcxproj b/Workspace_msvc/lib_util.vcxproj index aeee3f58e..86730b859 100644 --- a/Workspace_msvc/lib_util.vcxproj +++ b/Workspace_msvc/lib_util.vcxproj @@ -1,157 +1,157 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {2FA8F384-0775-F3B7-F8C3-85209222FC70} - utility - 10.0.17763.0 - - - - StaticLibrary - v142 - MultiByte - - - StaticLibrary - v142 - MultiByte - true - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - true - .\Debug_$(ProjectName)\ - .\Debug_$(ProjectName)\ - libivasutil - - - false - .\Release_$(ProjectName)\ - .\Release_$(ProjectName)\ - libivasutil - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) - false - - EnableFastChecks - MultiThreadedDebug - false - $(IntDir)$(ProjectName).pdb - Level4 - OldStyle - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - MaxSpeed - AnySuitable - false - false - ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - $(IntDir)$(ProjectName).pdb - Level4 - - Default - %(DisableSpecificWarnings) - - - $(OutDir)$(TargetName).lib - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + {2FA8F384-0775-F3B7-F8C3-85209222FC70} + utility + 10.0.17763.0 + + + + StaticLibrary + v141 + MultiByte + + + StaticLibrary + v141 + MultiByte + true + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + true + .\Debug_$(ProjectName)\ + .\Debug_$(ProjectName)\ + libivasutil + + + false + .\Release_$(ProjectName)\ + .\Release_$(ProjectName)\ + libivasutil + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) + false + + EnableFastChecks + MultiThreadedDebug + false + $(IntDir)$(ProjectName).pdb + Level4 + OldStyle + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + MaxSpeed + AnySuitable + false + false + ..\lib_com;..\lib_debug;..\lib_dec;..\lib_enc;..\lib_rend;..\lib_util;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);ZLIB_WINAPI;%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + $(IntDir)$(ProjectName).pdb + Level4 + + Default + %(DisableSpecificWarnings) + + + $(OutDir)$(TargetName).lib + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Workspace_msvc/renderer.vcxproj b/Workspace_msvc/renderer.vcxproj index 42b329781..1f95040e1 100644 --- a/Workspace_msvc/renderer.vcxproj +++ b/Workspace_msvc/renderer.vcxproj @@ -1,180 +1,180 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - renderer - {12B4C8A5-1E06-4E30-B443-D1F916F52B47} - renderer - 10.0.17763.0 - - - - Application - v142 - false - MultiByte - - - Application - v142 - false - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>15.0.27428.2015 - - - ..\ - .\Debug_$(ProjectName)\ - false - false - IVAS_rend - - - ..\ - .\Release_$(ProjectName)\ - false - false - IVAS_rend - - - - $(IntDir)$(ProjectName).tlb - - - - Disabled - ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;..\lib_dec;..\lib_enc;%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) - - EnableFastChecks - MultiThreadedDebug - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - OldStyle - Default - %(DisableSpecificWarnings) - - - _DEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - - $(OutDir)$(TargetName).exe - true - - true - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - - - - - $(IntDir)$(ProjectName).tlb - - - - MaxSpeed - AnySuitable - false - Neither - false - false - ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;.%(AdditionalIncludeDirectories) - _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) - true - - Default - MultiThreaded - true - Precise - false - - - $(IntDir)$(ProjectName).pdb - Level4 - true - - Default - %(DisableSpecificWarnings) - - - NDEBUG;%(PreprocessorDefinitions) - 0x0c0c - - - $(OutDir)$(TargetName).exe - true - - false - $(IntDir)$(ProjectName).pdb - Console - false - - MachineX86 - libcmtd.lib - - - - - - - - {54509728-928B-44D9-A118-A6F92F08B34F} - false - - - {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} - false - - - {2FA8F384-0775-F3B7-F8C3-85209222FC70} - false - - - {39ec200d-7795-4ff8-b214-b24eda5526ae} - false - - - {718DE063-A18B-BB72-9150-62B892E6FFA6} - false - - - - - - - - - - + + + + + Debug + Win32 + + + Release + Win32 + + + + renderer + {12B4C8A5-1E06-4E30-B443-D1F916F52B47} + renderer + 10.0.17763.0 + + + + Application + v141 + false + MultiByte + + + Application + v141 + false + MultiByte + + + + + + + + + + + + + + + <_ProjectFileVersion>15.0.27428.2015 + + + ..\ + .\Debug_$(ProjectName)\ + false + false + IVAS_rend + + + ..\ + .\Release_$(ProjectName)\ + false + false + IVAS_rend + + + + $(IntDir)$(ProjectName).tlb + + + + Disabled + ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;..\lib_dec;..\lib_enc;%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;WIN32;$(Macros);%(PreprocessorDefinitions) + + EnableFastChecks + MultiThreadedDebug + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + OldStyle + Default + %(DisableSpecificWarnings) + + + _DEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + + $(OutDir)$(TargetName).exe + true + + true + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + + + + + $(IntDir)$(ProjectName).tlb + + + + MaxSpeed + AnySuitable + false + Neither + false + false + ..\lib_com;..\lib_debug;..\lib_util;..\lib_rend;.%(AdditionalIncludeDirectories) + _CRT_SECURE_NO_WARNINGS;$(Macros);%(PreprocessorDefinitions) + true + + Default + MultiThreaded + true + Precise + false + + + $(IntDir)$(ProjectName).pdb + Level4 + true + + Default + %(DisableSpecificWarnings) + + + NDEBUG;%(PreprocessorDefinitions) + 0x0c0c + + + $(OutDir)$(TargetName).exe + true + + false + $(IntDir)$(ProjectName).pdb + Console + false + + MachineX86 + libcmtd.lib + + + + + + + + {54509728-928B-44D9-A118-A6F92F08B34F} + false + + + {E822DDAF-0F5F-4CD0-A694-38AE69DE74D3} + false + + + {2FA8F384-0775-F3B7-F8C3-85209222FC70} + false + + + {39ec200d-7795-4ff8-b214-b24eda5526ae} + false + + + {718DE063-A18B-BB72-9150-62B892E6FFA6} + false + + + + + + + + + + \ No newline at end of file diff --git a/lib_com/options.h b/lib_com/options.h index bbaad90f6..2361ee218 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -154,9 +154,6 @@ #define FIX_802_1137_1137_GSC_IVAS_FXFLT_DECODING /* VA: ISSUES 802 and 1137 Made sure that float and fixed point GCS bit allocation is the same during IVAS modes */ #define FIX_810_PREVENT_UNECESSARY_SAT_IN_TC /* VA : Prevent an unnecessary saturation that can happen in TC, have a minimal impact on most cases. Significant improvement for the last segment of LTV when TC is triggered */ #define FIX_826_PRECISION_LOST_AND_COMPL /* VA : Fix lost of precision that leads to unnecessary high noise floor and to some framing artifacts */ -#ifdef FIX_826_PRECISION_LOST_AND_COMPL -#define FIX_833_CORRECTION_to_826 /* VA : fix indexing error introduced in 826 */ -#endif /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_stereo_icbwe_dec.c b/lib_dec/ivas_stereo_icbwe_dec.c index 3eebbf0b3..d5acccc7a 100644 --- a/lib_dec/ivas_stereo_icbwe_dec.c +++ b/lib_dec/ivas_stereo_icbwe_dec.c @@ -1,2378 +1,2378 @@ -/****************************************************************************************************** - - (C) 2022-2024 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository. All Rights Reserved. - - This software is protected by copyright law and by international treaties. - The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, - Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., - Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, - Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other - contributors to this repository retain full ownership rights in their respective contributions in - the software. This notice grants no license of any kind, including but not limited to patent - license, nor is any license granted by implication, estoppel or otherwise. - - Contributors are required to enter into the IVAS codec Public Collaboration agreement before making - contributions. - - This software is provided "AS IS", without any express or implied warranties. The software is in the - development stage. It is intended exclusively for experts who have experience with such software and - solely for the purpose of inspection. All implied warranties of non-infringement, merchantability - and fitness for a particular purpose are hereby disclaimed and excluded. - - Any dispute, controversy or claim arising under or in relation to providing this software shall be - submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in - accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and - the United Nations Convention on Contracts on the International Sales of Goods. - -*******************************************************************************************************/ - -#include -#include -#include "options.h" -#include -#include "cnst.h" -#include "ivas_cnst.h" -#include "prot.h" -#include "prot_fx.h" -#include "ivas_prot.h" -#include "ivas_prot_fx.h" -#include "wmc_auto.h" -#include "rom_com.h" -#include "ivas_rom_com.h" -#ifdef IVAS_FLOAT_FIXED -#include "ivas_rom_com_fx.h" -#endif - - -#define Q_icBWE 16 - -/*-------------------------------------------------------------------* - * ic_bwe_dec_reset() - * - * core switching reset of IC BWE memory - *-------------------------------------------------------------------*/ - -#ifndef IVAS_FLOAT_FIXED -static void ic_bwe_dec_reset( - STEREO_ICBWE_DEC_HANDLE hStereoICBWE /* i/o: Stereo ICBWE handle */ -) -{ - /* unscaled & scaled SHB synthesis memory */ - set_f( hStereoICBWE->mem_syn_shb_nonref, 0, L_SHB_LAHEAD ); /* use samples from !acelp) */ - set_f( hStereoICBWE->mem_lpc_shbsynth_nonref, 0, LPC_SHB_ORDER ); - set_f( hStereoICBWE->mem_syn_shb_ola_nonref, 0, L_SHB_LAHEAD ); /* use samples from !acelp) */ - - /* inter-channel BWE SP and GSP mem reset */ - hStereoICBWE->memShbSpecMapping = 0; - - set_f( hStereoICBWE->memShbHilbert_nonref, 0, HILBERT_MEM_SIZE ); - set_f( hStereoICBWE->memShbInterp_nonref, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); - set_f( hStereoICBWE->memShb_fsout_nonref, 0, INTERP_3_2_MEM_LEN ); - hStereoICBWE->syn_dm_phase_nonref = 0; - - return; -} -#else -static void ic_bwe_dec_reset_fx( - STEREO_ICBWE_DEC_HANDLE hStereoICBWE /* i/o: Stereo ICBWE handle */ -) -{ - /* unscaled & scaled SHB synthesis memory */ - set32_fx( hStereoICBWE->mem_syn_shb_nonref_fx, 0, L_SHB_LAHEAD ); /* use samples from !acelp) */ - set32_fx( hStereoICBWE->mem_lpc_shbsynth_nonref_fx, 0, LPC_SHB_ORDER ); - set32_fx( hStereoICBWE->mem_syn_shb_ola_nonref_fx, 0, L_SHB_LAHEAD ); /* use samples from !acelp) */ - - hStereoICBWE->prev_Q_syn_shb_nonref = 31; - move16(); - hStereoICBWE->prev_Q_lpc_shbsynth_nonref = 31; - move16(); - hStereoICBWE->prev_Q_syn_shb_ola_nonref = 31; - move16(); - - /* inter-channel BWE SP and GSP mem reset */ - hStereoICBWE->memShbSpecMapping_fx = 0; - move32(); - hStereoICBWE->prev_Q_memshbspec = 31; - move16(); - - set32_fx( hStereoICBWE->memShbHilbert_nonref_fx, 0, HILBERT_MEM_SIZE ); - set32_fx( hStereoICBWE->memShbInterp_nonref_fx, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); - set32_fx( hStereoICBWE->memShb_fsout_nonref_fx, 0, INTERP_3_2_MEM_LEN ); - - hStereoICBWE->prev_Q_hilb = 31; - move16(); - hStereoICBWE->prev_Q_interp = 31; - move16(); - hStereoICBWE->prev_Q_fsout = 31; - move16(); - - hStereoICBWE->syn_dm_phase_nonref = 0; - move16(); - - return; -} -#endif - - -#ifndef IVAS_FLOAT_FIXED -/*-------------------------------------------------------------------* - * stereo_icBWE_dec() - * - * Spatial mapping of reference to the non-reference channels in SHB - *-------------------------------------------------------------------*/ - -void stereo_icBWE_dec( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - float *synthRef, /* i/o: Reference channel HB synthesis at output Fs */ - float *synth, /* o : Non reference channel HB synthesis at output Fs */ - const float *fb_synth_ref, /* i : ref. high-band synthesis 16-20 kHz */ - const float *voice_factors, /* i : voicing factors */ - const int16_t output_frame /* i : frame length */ -) -{ - int16_t i, j, k, nbSubFr; - Decoder_State *st; /* i/o: decoder state structure, primary channel */ - int16_t spIndx, gsIndx; - float excSHB_nonref[L_FRAME16k]; - float shb_synth_nonref[L_FRAME16k + L_SHB_LAHEAD]; - float error[L_FRAME32k]; - float nlMixFac[NB_SUBFR16k]; - float gsMapping, specMapping; - float fb_synth_nonref[L_FRAME48k]; - float scale, prev_pow, curr_pow, temp; - float alpha, winSlope, winLen, prevgsMapping; - float temp1, temp2; - float icbweM2Ref, ratio_L; - - STEREO_DFT_DEC_DATA_HANDLE hStereoDft = hCPE->hStereoDft; - STEREO_ICBWE_DEC_HANDLE hStereoICBWE = hCPE->hStereoICBWE; - st = hCPE->hCoreCoder[0]; - - /*--------------------------------------------------------------------* - * skip IC-BWE in case of mono DMX output * - * -------------------------------------------------------------------*/ - - if ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode > STEREO_DFT_RES_COD_OFF ) - { - hCPE->hStereoDft->core_hist[0] = st->core; - - return; - } - else if ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->nchan_out == 1 ) - { - - return; - } - - /*--------------------------------------------------------------------* - * skip IC-BWE in case of SID or NO_DATA frame - * -------------------------------------------------------------------*/ - - if ( st->core_brate <= SID_2k40 ) - { - return; - } - - /*--------------------------------------------------------------------* - * TD high band stereo filling * - * -------------------------------------------------------------------*/ - - /* update buffers for TD stereo filling */ - if ( hCPE->element_mode == IVAS_CPE_DFT ) - { - float hb_nrg = EPSILON; - float hb_nrg2 = EPSILON; - - if ( st->core == ACELP_CORE || st->last_core == ACELP_CORE ) - { - for ( i = 0; i < output_frame / 2; i++ ) - { - hb_nrg2 += synthRef[i] * synthRef[i]; - } - - hCPE->hStereoDft->hb_nrg_subr[0] = hb_nrg2; - hb_nrg += hb_nrg2; - hb_nrg2 = EPSILON; - - for ( ; i < output_frame; i++ ) - { - hb_nrg2 += synthRef[i] * synthRef[i]; - } - - hCPE->hStereoDft->hb_nrg_subr[1] = hb_nrg2; - hb_nrg += hb_nrg2; - - mvr2r( synthRef, hCPE->hStereoDft->hb_stefi_sig + hCPE->hStereoDft->hb_stefi_delay, output_frame ); - } - else - { - set_zero( hCPE->hStereoDft->hb_stefi_sig + hCPE->hStereoDft->hb_stefi_delay, output_frame ); - } - hCPE->hStereoDft->hb_nrg_subr[0] *= hCPE->hStereoDft->NFFT / 2; - hCPE->hStereoDft->hb_nrg_subr[1] *= hCPE->hStereoDft->NFFT / 2; - hCPE->hStereoDft->hb_nrg[0] = hb_nrg; - hCPE->hStereoDft->td_gain[0] = 0; - hCPE->hStereoDft->core_hist[0] = st->core; - } - - /*--------------------------------------------------------------------* - * IC-BWE * - * -------------------------------------------------------------------*/ - - if ( st->core != ACELP_CORE || st->extl == -1 || ( hCPE->element_mode == IVAS_CPE_TD && hCPE->hCoreCoder[0]->tdm_LRTD_flag ) ) - { - return; - } - else if ( hCPE->element_mode == IVAS_CPE_DFT && st->core_brate <= SID_2k40 ) - { - mvr2r( synthRef, synth, output_frame ); - return; - } - - - set_f( fb_synth_nonref, 0, L_FRAME48k ); - - /* core switching reset */ - if ( st->last_core != ACELP_CORE || st->bwidth == WB ) - { - ic_bwe_dec_reset( hStereoICBWE ); - - if ( st->last_core != ACELP_CORE ) - { - hStereoICBWE->prevSpecMapping = 0.0f; - hStereoICBWE->prevgsMapping = 1.0f; - hStereoICBWE->icbweM2Ref_prev = 1.0f; - } - - if ( st->bwidth == WB ) - { - /* copy to outputHB and reset hb_synth values */ - mvr2r( synthRef, synth, output_frame ); - - if ( st->element_mode == IVAS_CPE_TD ) - { - hStereoICBWE->prevSpecMapping = 0.0f; - hStereoICBWE->prevgsMapping = 1.0f; - hStereoICBWE->icbweM2Ref_prev = 1.0f; - } - else if ( st->element_mode == IVAS_CPE_DFT ) - { - hStereoICBWE->refChanIndx_bwe = L_CH_INDX; - hStereoICBWE->prevSpecMapping = 0.0f; - - prevgsMapping = hStereoICBWE->prevgsMapping; - temp1 = hStereoDft->side_gain[2 * STEREO_DFT_BAND_MAX + hStereoDft->nbands - 1]; - icbweM2Ref = 1.f + temp1; - gsMapping = 1.f - temp1; - - winLen = (int16_t) ( ( SHB_OVERLAP_LEN * st->output_Fs ) / 16000 ); - winSlope = 1.0f / winLen; - alpha = winSlope; - for ( i = 0; i < winLen; i++ ) - { - synthRef[i] *= ( alpha * ( icbweM2Ref ) + ( 1.0f - alpha ) * ( hStereoICBWE->icbweM2Ref_prev ) ); - synth[i] *= ( alpha * ( gsMapping ) + ( 1.0f - alpha ) * ( prevgsMapping ) ); - alpha += winSlope; - } - for ( ; i < NS2SA( st->output_Fs, FRAME_SIZE_NS ); i++ ) - { - synthRef[i] *= ( icbweM2Ref ); - synth[i] *= ( gsMapping ); - } - hStereoICBWE->icbweM2Ref_prev = icbweM2Ref; - hStereoICBWE->prevgsMapping = gsMapping; - } - - return; - } - } - - if ( !st->bfi ) - { - hStereoICBWE->refChanIndx_bwe = get_next_indice( st, STEREO_ICBWE_REFBITS ); - if ( st->flag_ACELP16k == 1 ) - { - spIndx = get_next_indice( st, STEREO_ICBWE_SPBITS ); - } - else - { - spIndx = 3; - } - if ( st->element_mode == IVAS_CPE_TD ) - { - gsIndx = get_next_indice( st, STEREO_ICBWE_GSBITS ); - } - else - { - gsIndx = get_next_indice( st, STEREO_ICBWE_GSBITS_DFT ); - } - - /* Store indices in case of frame loss */ - hStereoICBWE->prev_spIndx = spIndx; - hStereoICBWE->prev_gsIndx = gsIndx; - } - else /*bfi*/ - { - /* Retrieve last decoded indices */ - spIndx = hStereoICBWE->prev_spIndx; - gsIndx = hStereoICBWE->prev_gsIndx; - hStereoICBWE->refChanIndx_bwe = hStereoICBWE->prev_refChanIndx_bwe; - } - - /* IC-BWE parameter de-quant */ - /* sp Mapping */ - hStereoICBWE->prevSpecMapping = usdequant( spIndx, -0.6f, 0.2f ); - - /* gs Mapping */ - prevgsMapping = hStereoICBWE->prevgsMapping; - - if ( st->element_mode == IVAS_CPE_TD ) - { - hStereoICBWE->prevgsMapping = icbwe_gsMapping_tbl[gsIndx]; - } - else - { - hStereoICBWE->prevgsMapping = icbwe_gsMappingDFT_tbl[gsIndx]; - } - - hStereoICBWE->prevgsMapping = powf( 10, hStereoICBWE->prevgsMapping ); - - specMapping = hStereoICBWE->prevSpecMapping; - gsMapping = hStereoICBWE->prevgsMapping; - - if ( ( st->extl == SWB_TBE || st->extl == FB_TBE ) && st->flag_ACELP16k == 1 ) - { - mvr2r( voice_factors, nlMixFac, NB_SUBFR16k ); - if ( hCPE->hStereoDftDmx != NULL ) - { - if ( hCPE->hStereoDftDmx->targetGain < 0.5f || hCPE->hStereoDftDmx->targetGain > 2.0f ) - { - v_multc( voice_factors, 0.5f, nlMixFac, NB_SUBFR16k ); - } - } - else - { - if ( hCPE->hStereoTCA->targetGain < 0.5f || hCPE->hStereoTCA->targetGain > 2.0f ) - { - v_multc( voice_factors, 0.5f, nlMixFac, NB_SUBFR16k ); - } - } - - nbSubFr = ( st->flag_ACELP16k == 0 ) ? NB_SUBFR : NB_SUBFR16k; - for ( i = 0, k = 0; i < nbSubFr; i++ ) - { - if ( hCPE->hCoreCoder[0]->coder_type == UNVOICED || hStereoICBWE->MSFlag == 1 ) - { - temp1 = 0; - temp2 = 1.0f; - } - else - { - temp1 = sqrtf( nlMixFac[i] ); - temp2 = sqrtf( 1.0f - nlMixFac[i] ); - } - - for ( j = 0; j < L_FRAME16k / nbSubFr; j++, k++ ) - { - excSHB_nonref[k] = temp1 * hStereoICBWE->nlExc16k[k] + temp2 * hStereoICBWE->mixExc16k[k]; - } - } - - /* LP synthesis */ - mvr2r( hStereoICBWE->mem_syn_shb_nonref, shb_synth_nonref, L_SHB_LAHEAD ); - syn_filt( hStereoICBWE->lpSHBRef, LPC_SHB_ORDER, excSHB_nonref, shb_synth_nonref + L_SHB_LAHEAD, L_FRAME16k, hStereoICBWE->mem_lpc_shbsynth_nonref, 1 ); - - prev_pow = sum2_f( shb_synth_nonref, L_SHB_LAHEAD + 10 ); - curr_pow = sum2_f( shb_synth_nonref + L_SHB_LAHEAD + 10, L_SHB_LAHEAD + 10 ); - - if ( prev_pow == 0 ) - { - scale = 0; - } - else - { - scale = sqrtf( curr_pow / prev_pow ); - } - - for ( i = 0; i < L_SHB_LAHEAD; i++ ) - { - shb_synth_nonref[i] *= scale; - } - - for ( ; i < L_SHB_LAHEAD + 10; i++ ) - { - temp = ( i - 19 ) / 10.0f; - shb_synth_nonref[i] *= ( temp * 1.0f + ( 1.0f - temp ) * scale ); - } - /* spec and gs adjustment */ - deemph( shb_synth_nonref + L_SHB_LAHEAD, specMapping, L_FRAME16k, &( hStereoICBWE->memShbSpecMapping ) ); - mvr2r( shb_synth_nonref + L_FRAME16k, hStereoICBWE->mem_syn_shb_nonref, L_SHB_LAHEAD ); - - ScaleShapedSHB( SHB_OVERLAP_LEN, shb_synth_nonref, hStereoICBWE->mem_syn_shb_ola_nonref, hStereoICBWE->gshapeRef, ( hStereoICBWE->gFrameRef * gsMapping * 0.9f ), window_shb, subwin_shb ); - - if ( st->extl == FB_TBE ) - { - v_multc( fb_synth_ref, gsMapping, fb_synth_nonref, L_FRAME48k ); - } - - /* generate 32kHz SHB synthesis from 12.8(16)kHz signal */ - GenSHBSynth( shb_synth_nonref, error, hStereoICBWE->memShbHilbert_nonref, hStereoICBWE->memShbInterp_nonref, st->L_frame, &( hStereoICBWE->syn_dm_phase_nonref ) ); - } - else - { - mvr2r( synthRef, synth, output_frame ); - - winLen = (int16_t) ( ( SHB_OVERLAP_LEN * st->output_Fs ) / 16000 ); - winSlope = 1.0f / winLen; - alpha = winSlope; - - ratio_L = ( hCPE->element_mode == IVAS_CPE_DFT ) ? ( 0.5f ) : ( tdm_ratio_tabl[hCPE->hStereoTD->tdm_last_ratio_idx] ); - - icbweM2Ref = gsMapping; - if ( hStereoICBWE->refChanIndx_bwe == L_CH_INDX ) - { - if ( ratio_L >= 0.1f ) - { - icbweM2Ref = sqrtf( 0.5f - min( 0.5f, ( 1 - ratio_L ) * ( 1 - ratio_L ) * gsMapping * gsMapping ) ) / ratio_L; - } - } - else - { - if ( ratio_L <= 0.9f ) - { - icbweM2Ref = sqrtf( 0.5f - min( 0.5f, ratio_L * ratio_L * gsMapping * gsMapping ) ) / ( 1 - ratio_L ); - } - } - - icbweM2Ref = max( gsMapping, icbweM2Ref ); - - for ( i = 0; i < winLen; i++ ) - { - synthRef[i] *= ( alpha * ( icbweM2Ref ) + ( 1.0f - alpha ) * ( hStereoICBWE->icbweM2Ref_prev ) ); - synth[i] *= ( alpha * ( gsMapping ) + ( 1.0f - alpha ) * ( prevgsMapping ) ); - alpha += winSlope; - } - for ( ; i < NS2SA( st->output_Fs, FRAME_SIZE_NS ); i++ ) - { - synthRef[i] *= ( icbweM2Ref ); - synth[i] *= ( gsMapping ); - } - hStereoICBWE->icbweM2Ref_prev = icbweM2Ref; - - ic_bwe_dec_reset( hStereoICBWE ); - hStereoICBWE->prevSpecMapping = 0.0f; - - return; - } - - /* resample to output FS */ - if ( st->output_Fs == 48000 ) - { - interpolate_3_over_2_allpass( error, L_FRAME32k, synth, hStereoICBWE->memShb_fsout_nonref ); - } - else if ( st->output_Fs == 32000 ) - { - mvr2r( error, synth, L_FRAME32k ); - } - else if ( st->output_Fs == 16000 ) - { - Decimate_allpass_steep( error, hStereoICBWE->memShb_fsout_nonref, L_FRAME32k, synth ); - } - - - if ( st->extl == FB_TBE && st->output_Fs == 48000 ) - { - v_add( fb_synth_nonref, synth, synth, L_FRAME48k ); - } - - /* copy to outputHB and reset hb_synth values */ - ratio_L = ( hCPE->element_mode == IVAS_CPE_DFT ) ? ( 0.5f ) : ( tdm_ratio_tabl[hCPE->hStereoTD->tdm_last_ratio_idx] ); - - icbweM2Ref = gsMapping; - if ( hStereoICBWE->refChanIndx_bwe == L_CH_INDX ) - { - if ( ratio_L >= 0.1f ) - { - icbweM2Ref = sqrtf( 0.5f - min( 0.5f, ( 1 - ratio_L ) * ( 1 - ratio_L ) * gsMapping * gsMapping ) ) / ratio_L; - } - } - else - { - if ( ratio_L <= 0.9f ) - { - icbweM2Ref = sqrtf( 0.5f - min( 0.5f, ratio_L * ratio_L * gsMapping * gsMapping ) ) / ( 1 - ratio_L ); - } - } - - icbweM2Ref = max( gsMapping, icbweM2Ref ); - - winLen = (int16_t) ( ( SHB_OVERLAP_LEN * st->output_Fs ) / 16000 ); - winSlope = 1.0f / winLen; - alpha = winSlope; - for ( i = 0; i < winLen; i++ ) - { - synthRef[i] *= ( alpha * ( icbweM2Ref ) + ( 1.0f - alpha ) * ( hStereoICBWE->icbweM2Ref_prev ) ); - alpha += winSlope; - } - - for ( ; i < NS2SA( st->output_Fs, FRAME_SIZE_NS ); i++ ) - { - synthRef[i] *= ( icbweM2Ref ); - } - - hStereoICBWE->icbweM2Ref_prev = icbweM2Ref; - - return; -} -#else -static Word16 FindScale( - Word32 *buff, - Word16 len, - Word16 Q_buff, - Word16 Q_prev ) -{ - Word32 maxVal; - Word16 norm_shift, Q_out; - - maximum_abs_32_fx( buff, len, &maxVal ); - norm_shift = norm_l( maxVal ); - if ( maxVal == 0 ) - { - norm_shift = 31; - move16(); - } - - Q_out = s_min( Q_prev, add( Q_buff, norm_shift ) ); - - return Q_out; -} - - -void stereo_icBWE_dec_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - Word32 *synthRef_fx, /* i/o: Reference channel HB synthesis at output Fs Q11 */ - Word32 *synth_fx, /* o : Non reference channel HB synthesis at output Fs Q11 */ - const Word16 *fb_synth_ref_fx, /* i : ref. high-band synthesis 16-20 kHz Q11 */ - const Word16 *voice_factors_fx, /* i : voicing factors Q15 */ - const Word16 output_frame, /* i : frame length */ - Word16 *Q_syn /* i : Q of synth and synthRef buffers */ -) -{ - Word16 i, j, k, nbSubFr; - Decoder_State *st; /* i/o: decoder state structure, primary channel */ - Word16 spIndx, gsIndx; - Word32 excSHB_nonref_fx[L_FRAME16k]; - Word32 shb_synth_nonref_fx[L_FRAME16k + L_SHB_LAHEAD]; - Word32 error_fx[L_FRAME32k]; - Word16 nlMixFac_fx[NB_SUBFR16k]; - Word16 specMapping_fx; - Word16 fb_synth_nonref_fx[L_FRAME48k]; - Word32 prev_pow_fx, curr_pow_fx, maxVal1, maxVal; - Word16 scale_fx, e_scale_fx; - Word16 alpha_fx, winSlope_fx, winLen_fx; - Word16 prevgsMapping_fx; - Word16 temp1_fx, temp2_fx; - Word16 icbweM2Ref_fx, ratio_L_fx; - Word16 gsMapping_fx; -#ifndef FIX_826_PRECISION_LOST_AND_COMPL - Word32 hb_nrg_fx, hb_nrg2_fx; -#else - Word32 hb_nrg_fx; -#endif - Word16 Q_syn_shb; - Word16 shift_prev_pow, synthRef_shift; - Word32 L_tmp; - Word16 tmp; - Word32 L_nlExc16k, L_mixExc16k; - - STEREO_DFT_DEC_DATA_HANDLE hStereoDft = hCPE->hStereoDft; - STEREO_ICBWE_DEC_HANDLE hStereoICBWE = hCPE->hStereoICBWE; - st = hCPE->hCoreCoder[0]; - - /*--------------------------------------------------------------------* - * skip IC-BWE in case of mono DMX output * - * -------------------------------------------------------------------*/ - - test(); - test(); - test(); - IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && EQ_16( hCPE->nchan_out, 1 ) && GT_16( hCPE->hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) ) - { - hCPE->hStereoDft->core_hist[0] = st->core; - move16(); - - return; - } - ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && EQ_16( hCPE->nchan_out, 1 ) ) - { - return; - } - - /*--------------------------------------------------------------------* - * skip IC-BWE in case of SID or NO_DATA frame - * -------------------------------------------------------------------*/ - - IF( LE_32( st->core_brate, SID_2k40 ) ) - { - return; - } - - /*--------------------------------------------------------------------* - * TD high band stereo filling * - * -------------------------------------------------------------------*/ - - /* update buffers for TD stereo filling */ - IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) - { - hb_nrg_fx = 0; - move32(); -#ifndef FIX_826_PRECISION_LOST_AND_COMPL - hb_nrg2_fx = 0; -#endif - move32(); - maximum_abs_32_fx( synthRef_fx, output_frame, &maxVal ); - synthRef_shift = norm_l( maxVal ); - if ( maxVal == 0 ) - { - synthRef_shift = 31; - move16(); - } -#ifndef FIX_826_PRECISION_LOST_AND_COMPL /* Not needed Q11 is already enough */ - synthRef_shift = sub( synthRef_shift, shr( add( find_guarded_bits_fx( output_frame ), 1 ), 1 ) ); -#else - synthRef_shift = sub( synthRef_shift, shr( add( find_guarded_bits_fx( shr( output_frame, 1 ) ), 1 ), 1 ) ); -#endif - test(); - IF( EQ_16( st->core, ACELP_CORE ) || EQ_16( st->last_core, ACELP_CORE ) ) - { -#ifdef FIX_826_PRECISION_LOST_AND_COMPL - Word64 W_tmp = 0; - move64(); - tmp = shl_sat( 1, synthRef_shift ); -#endif - FOR( i = 0; i < shr( output_frame, 1 ); i++ ) - { - // needed to be adjusted for q -#ifndef FIX_826_PRECISION_LOST_AND_COMPL - L_tmp = L_shl( synthRef_fx[i], synthRef_shift ); - hb_nrg2_fx = L_add( hb_nrg2_fx, Mpy_32_32( L_tmp, L_tmp ) ); // 2*(Qx + SynthRef_shift) - 31 -#else - L_tmp = Mpy_32_16_1( synthRef_fx[i], tmp ); - W_tmp = W_mac_32_32( W_tmp, L_tmp, L_tmp ); -#endif - } -#ifdef FIX_826_PRECISION_LOST_AND_COMPL - hb_nrg_fx = W_round48_L( W_tmp ); - hCPE->hStereoDft->hb_nrg_subr_fx[0] = hb_nrg_fx; - move32(); - hStereoDft->q_hb_nrg_subr = sub( shl( add( *Q_syn, synthRef_shift ), 1 ), 45 ); - move16(); - W_tmp = 0; - move64(); - FOR( ; i < output_frame; i++ ) - { - L_tmp = Mpy_32_16_1( synthRef_fx[i], tmp ); - W_tmp = W_mac_32_32( W_tmp, L_tmp, L_tmp ); - } - - hCPE->hStereoDft->hb_nrg_subr_fx[1] = W_round48_L( W_tmp ); // 2*(Qx + SynthRef_shift) - 45 - hb_nrg_fx = L_add( hCPE->hStereoDft->hb_nrg_subr_fx[0], hCPE->hStereoDft->hb_nrg_subr_fx[1] ); -#else - hCPE->hStereoDft->hb_nrg_subr_fx[0] = hb_nrg2_fx; - move32(); - hStereoDft->q_hb_nrg_subr = sub( add( *Q_syn, synthRef_shift ), 31 ); - hb_nrg_fx = L_add( hb_nrg_fx, hb_nrg2_fx ); - hb_nrg2_fx = 0; - move32(); - - FOR( ; i < output_frame; i++ ) - { - L_tmp = L_shl( synthRef_fx[i], synthRef_shift ); - hb_nrg2_fx = L_add( hb_nrg2_fx, Mpy_32_32( L_tmp, L_tmp ) ); - } - - hCPE->hStereoDft->hb_nrg_subr_fx[1] = hb_nrg2_fx; // 2*(Qx + SynthRef_shift) - 31 - move32(); - hb_nrg_fx = L_add( hb_nrg_fx, hb_nrg2_fx ); -#endif - - - Copy32( synthRef_fx, hCPE->hStereoDft->hb_stefi_sig_fx + hCPE->hStereoDft->hb_stefi_delay, output_frame ); -#ifndef FIX_826_PRECISION_LOST_AND_COMPL - Scale_sig32( hCPE->hStereoDft->hb_stefi_sig_fx + hCPE->hStereoDft->hb_stefi_delay, output_frame, -5 ); -#endif - } - ELSE - { - set32_fx( hCPE->hStereoDft->hb_stefi_sig_fx + hCPE->hStereoDft->hb_stefi_delay, 0, output_frame ); -#ifdef MSAN_FIX - hCPE->hStereoDft->hb_nrg_subr_fx[0] = 0; - move32(); - hCPE->hStereoDft->hb_nrg_subr_fx[1] = 0; - move32(); -#endif // MSAN_FIX - } - hCPE->hStereoDft->hb_nrg_subr_fx[0] = ( Mpy_32_16_1( hCPE->hStereoDft->hb_nrg_subr_fx[0], shl( hCPE->hStereoDft->NFFT / 2, 6 ) ) ); // 2 * (Qx + SynthRef_shift) - 40 // 2 * (Qx + SynthRef_shift) - 31 - 15 - move32(); - hCPE->hStereoDft->hb_nrg_subr_fx[1] = ( Mpy_32_16_1( hCPE->hStereoDft->hb_nrg_subr_fx[1], shl( hCPE->hStereoDft->NFFT / 2, 6 ) ) ); // 2 * (Qx + SynthRef_shift) - 40 - move32(); -#ifndef FIX_826_PRECISION_LOST_AND_COMPL - hCPE->hStereoDft->q_hb_nrg_subr = sub( shl( ( *Q_syn + synthRef_shift ), 1 ), 40 ); -#else - hCPE->hStereoDft->q_hb_nrg_subr = sub( shl( ( *Q_syn + synthRef_shift ), 1 ), 45 + 9 ); -#endif - hCPE->hStereoDft->hb_nrg_fx[0] = hb_nrg_fx; // 2 * (Qx + SynthRef_shift) - 31 - move32(); - hCPE->hStereoDft->td_gain_fx[0] = 0; - move32(); - hCPE->hStereoDft->core_hist[0] = st->core; - move16(); - } - - /*--------------------------------------------------------------------* - * IC-BWE * - * -------------------------------------------------------------------*/ - test(); - test(); - test(); - test(); - IF( st->core != ACELP_CORE || EQ_16( st->extl, -1 ) || ( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && NE_16( hCPE->hCoreCoder[0]->tdm_LRTD_flag, 0 ) ) ) - { - return; - } - ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && LE_32( st->core_brate, SID_2k40 ) ) - { - Copy32( synthRef_fx, synth_fx, output_frame ); - return; - } - - - set16_fx( fb_synth_nonref_fx, 0, L_FRAME48k ); - - /* core switching reset */ - test(); - IF( st->last_core != ACELP_CORE || EQ_16( st->bwidth, (Word16) WB ) ) - { - ic_bwe_dec_reset_fx( hStereoICBWE ); - - IF( st->last_core != ACELP_CORE ) - { - hStereoICBWE->prevSpecMapping_fx = 0; - move16(); - hStereoICBWE->prevgsMapping_fx = 16384; - move16(); - hStereoICBWE->icbweM2Ref_prev_fx = 16384; - move16(); - } - - IF( EQ_16( st->bwidth, WB ) ) - { - /* copy to outputHB and reset hb_synth values */ - Copy32( synthRef_fx, synth_fx, output_frame ); - - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) - { - hStereoICBWE->prevSpecMapping_fx = 0; - move16(); - hStereoICBWE->prevgsMapping_fx = 16384; - move16(); - hStereoICBWE->icbweM2Ref_prev_fx = 16384; - move16(); - } - ELSE IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) - { - hStereoICBWE->refChanIndx_bwe = L_CH_INDX; - move16(); - hStereoICBWE->prevSpecMapping_fx = 0; - move16(); - - prevgsMapping_fx = hStereoICBWE->prevgsMapping_fx; - move16(); - temp1_fx = shr( extract_h( hStereoDft->side_gain_fx[2 * STEREO_DFT_BAND_MAX + hStereoDft->nbands - 1] ), 1 ); - icbweM2Ref_fx = add( 16384, temp1_fx ); - gsMapping_fx = sub( 16384, temp1_fx ); - - winLen_fx = extract_l( Mpy_32_16_1( st->output_Fs, 41 ) ); //(int16_t)((SHB_OVERLAP_LEN * st->output_Fs) / 16000); - winSlope_fx = div_s( 1, winLen_fx ); - alpha_fx = winSlope_fx; - move16(); - FOR( i = 0; i < winLen_fx; i++ ) - { -#ifndef FIX_826_PRECISION_LOST_AND_COMPL - L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); // Q15 + Q14 - L_tmp = L_mac0( L_tmp, sub( 32767, alpha_fx ), ( hStereoICBWE->icbweM2Ref_prev_fx ) ); // Q15 + Q14; - tmp = shl( round_fx( L_tmp ), 1 ); // Q = 15 + 14 - 16 + 1 = Q14 - synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp ); - move32(); - L_tmp = L_mult0( alpha_fx, gsMapping_fx ); - L_tmp = L_mac0( L_tmp, ( sub( 32767, alpha_fx ) ), ( prevgsMapping_fx ) ); - tmp = shl( round_fx( L_tmp ), 1 ); // Q = 15 + 14 - 16 + 1 = Q14 - synth_fx[i] = Mpy_32_16_1( synth_fx[i], tmp ); - move32(); - IF( LE_16( alpha_fx, sub( 32767, winSlope_fx ) ) ) - { - alpha_fx = add( alpha_fx, winSlope_fx ); - } -#else - /*synthRef[i] *= ( alpha * ( icbweM2Ref ) + ( 1.0f - alpha ) * ( hStereoICBWE->icbweM2Ref_prev ) );*/ - temp1_fx = sub( 32767, alpha_fx ); - L_tmp = L_mult( alpha_fx, icbweM2Ref_fx ); // Q15 + Q14 + 1 - L_tmp = L_mac( L_tmp, temp1_fx, hStereoICBWE->icbweM2Ref_prev_fx ); // Q15 + Q14 +1 ; - synthRef_fx[i] = L_shl( Mpy_32_32( synthRef_fx[i], L_tmp ), 1 ); - move32(); - /*synth[i] *= ( alpha * ( gsMapping ) + ( 1.0f - alpha ) * ( prevgsMapping ) );*/ - L_tmp = L_mult( alpha_fx, gsMapping_fx ); - L_tmp = L_mac( L_tmp, temp1_fx, prevgsMapping_fx ); - synth_fx[i] = L_shl( Mpy_32_32( synth_fx[i], L_tmp ), 1 ); - move32(); - alpha_fx = add_sat( alpha_fx, winSlope_fx ); -#endif - } - FOR( ; i < NS2SA( st->output_Fs, FRAME_SIZE_NS ); i++ ) - { - synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], icbweM2Ref_fx ); - move32(); - synth_fx[i] = Mpy_32_16_1( synth_fx[i], gsMapping_fx ); - move32(); - } - hStereoICBWE->icbweM2Ref_prev_fx = icbweM2Ref_fx; - move16(); - hStereoICBWE->prevgsMapping_fx = gsMapping_fx; - move16(); - - *Q_syn = sub( *Q_syn, 1 ); - } - - return; - } - } - - IF( st->bfi == 0 ) - { - hStereoICBWE->refChanIndx_bwe = get_next_indice_fx( st, STEREO_ICBWE_REFBITS ); - IF( EQ_16( st->flag_ACELP16k, 1 ) ) - { - spIndx = get_next_indice_fx( st, STEREO_ICBWE_SPBITS ); - } - ELSE - { - spIndx = 3; - move16(); - } - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) - { - gsIndx = get_next_indice_fx( st, STEREO_ICBWE_GSBITS ); - } - ELSE - { - gsIndx = get_next_indice_fx( st, STEREO_ICBWE_GSBITS_DFT ); - } - - /* Store indices in case of frame loss */ - hStereoICBWE->prev_spIndx = spIndx; - move16(); - hStereoICBWE->prev_gsIndx = gsIndx; - move16(); - } - ELSE /*bfi*/ - { - /* Retrieve last decoded indices */ - spIndx = hStereoICBWE->prev_spIndx; - move16(); - gsIndx = hStereoICBWE->prev_gsIndx; - move16(); - hStereoICBWE->refChanIndx_bwe = hStereoICBWE->prev_refChanIndx_bwe; - move16(); - } - - /* IC-BWE parameter de-quant */ - /* sp Mapping */ - hStereoICBWE->prevSpecMapping_fx = usdequant_fx( spIndx, -19661, 3277 ); // Q15 - - /* gs Mapping */ - prevgsMapping_fx = hStereoICBWE->prevgsMapping_fx; // Q14 - move16(); - - IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) - { - hStereoICBWE->prevgsMapping_fx = pow_10_icbwe_gsMapping_tbl_fx[gsIndx]; - move16(); - } - ELSE - { - hStereoICBWE->prevgsMapping_fx = pow_10_icbwe_gsMappingDFT_tbl_fx[gsIndx]; - move16(); - } - - // hStereoICBWE->prevgsMapping = powf( 10, hStereoICBWE->prevgsMapping ); - - specMapping_fx = hStereoICBWE->prevSpecMapping_fx; // Q15 - move16(); - gsMapping_fx = hStereoICBWE->prevgsMapping_fx; // Q14 - move16(); - - test(); - test(); - IF( ( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, FB_TBE ) ) && EQ_16( st->flag_ACELP16k, 1 ) ) - { - Copy( voice_factors_fx, nlMixFac_fx, NB_SUBFR16k ); // Q15 - IF( hCPE->hStereoDftDmx != NULL ) - { - test(); - IF( LT_32( hCPE->hStereoDftDmx->targetGain_fx, 268435456 ) || GT_32( hCPE->hStereoDftDmx->targetGain_fx, 1073741824 ) ) - { - v_multc_fixed_16_16( voice_factors_fx, 16384, nlMixFac_fx, NB_SUBFR16k ); - } - } - ELSE - { - test(); - IF( LT_32( hCPE->hStereoTCA->targetGain_fx, 268435456 ) || GT_32( hCPE->hStereoTCA->targetGain_fx, 1073741824 ) ) - { - v_multc_fixed_16_16( voice_factors_fx, 16384, nlMixFac_fx, NB_SUBFR16k ); - } - } - - // nbSubFr = ( st->flag_ACELP16k == 0 ) ? NB_SUBFR : NB_SUBFR16k; - IF( st->flag_ACELP16k == 0 ) - { - nbSubFr = NB_SUBFR; - move16(); - } - ELSE - { - nbSubFr = NB_SUBFR16k; - move16(); - } - k = 0; - move16(); - FOR( i = 0; i < nbSubFr; i++ ) - { - IF( EQ_16( hCPE->hCoreCoder[0]->coder_type, UNVOICED ) || EQ_16( hStereoICBWE->MSFlag, 1 ) ) - { - temp1_fx = 0; - move16(); - temp2_fx = 32767; - move16(); - } - ELSE - { - tmp = 0; - move16(); - temp1_fx = Sqrt16( nlMixFac_fx[i], &tmp ); - IF( LT_16( tmp, 0 ) ) - { - temp1_fx = shl( temp1_fx, tmp ); - } - tmp = 0; - move16(); - temp2_fx = Sqrt16( sub( 32767, nlMixFac_fx[i] ), &tmp ); - IF( LT_16( tmp, 0 ) ) - { - temp2_fx = shl( temp2_fx, tmp ); - } - } - - FOR( j = 0; j < L_FRAME16k / nbSubFr; j++ ) - { - // common Q for addition - L_nlExc16k = L_deposit_l( hStereoICBWE->nlExc16k_fx[k] ); // prev_q_bwe_exc - 16 - L_mixExc16k = L_deposit_l( hStereoICBWE->mixExc16k_fx[k] ); // Q_exc - L_nlExc16k = L_shl( L_nlExc16k, sub( Q_icBWE, ( sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // Q_icBWE -#ifndef FIX_736_BWE_SECT_C - L_mixExc16k = L_shl( L_mixExc16k, Q_icBWE - st->Q_exc ); // Q_icBWE -#else - L_mixExc16k = L_shl( L_mixExc16k, sub( Q_icBWE, ( sub( st->prev_Q_bwe_exc, 25 ) ) ) ); // Q_icBWE -#endif - excSHB_nonref_fx[k] = L_add( Mpy_32_16_1( L_nlExc16k, temp1_fx ), Mpy_32_16_1( L_mixExc16k, temp2_fx ) ); // Q_icBWE - move32(); - k++; - } - } - - /* LP synthesis */ - Q_syn_shb = 31; - move16(); - - Q_syn_shb = FindScale( hStereoICBWE->mem_syn_shb_nonref_fx, LPC_SHB_ORDER, hStereoICBWE->prev_Q_syn_shb_nonref, Q_syn_shb ); - Q_syn_shb = FindScale( hStereoICBWE->lpSHBRef_fx, LPC_SHB_ORDER + 1, 12, Q_syn_shb ); - Q_syn_shb = FindScale( excSHB_nonref_fx, L_FRAME16k, Q_icBWE, Q_syn_shb ); - Q_syn_shb = FindScale( hStereoICBWE->mem_lpc_shbsynth_nonref_fx, LPC_SHB_ORDER, hStereoICBWE->prev_Q_lpc_shbsynth_nonref, Q_syn_shb ); - - Q_syn_shb = sub( Q_syn_shb, 3 ); // gaurded bits - - Scale_sig32( hStereoICBWE->lpSHBRef_fx, LPC_SHB_ORDER + 1, sub( Q_syn_shb, 12 ) ); - Scale_sig32( excSHB_nonref_fx, L_FRAME16k, sub( Q_syn_shb, Q_icBWE ) ); - Scale_sig32( hStereoICBWE->mem_lpc_shbsynth_nonref_fx, LPC_SHB_ORDER, sub( Q_syn_shb, hStereoICBWE->prev_Q_lpc_shbsynth_nonref ) ); - Scale_sig32( hStereoICBWE->mem_syn_shb_nonref_fx, L_SHB_LAHEAD, sub( Q_syn_shb, hStereoICBWE->prev_Q_syn_shb_nonref ) ); - - - Copy32( hStereoICBWE->mem_syn_shb_nonref_fx, shb_synth_nonref_fx, L_SHB_LAHEAD ); - - E_UTIL_synthesis_fx( 0, hStereoICBWE->lpSHBRef_fx, excSHB_nonref_fx, shb_synth_nonref_fx + L_SHB_LAHEAD, L_FRAME16k, hStereoICBWE->mem_lpc_shbsynth_nonref_fx, 1, LPC_SHB_ORDER ); - - hStereoICBWE->prev_Q_lpc_shbsynth_nonref = Q_syn_shb; - move16(); - - maximum_abs_32_fx( shb_synth_nonref_fx, L_SHB_LAHEAD + 10 + L_SHB_LAHEAD + 10, &maxVal1 ); // Qsyn_shb - - shift_prev_pow = sub( norm_l( maxVal1 ), find_guarded_bits_fx( L_SHB_LAHEAD + 10 ) ); - - prev_pow_fx = 0; - move32(); - curr_pow_fx = 0; - move32(); - FOR( i = 0; i < L_SHB_LAHEAD + 10; i++ ) - { - L_tmp = L_shl( shb_synth_nonref_fx[i], shift_prev_pow ); - prev_pow_fx = L_add( prev_pow_fx, Mpy_32_32( L_tmp, L_tmp ) ); - } - FOR( i = 0; i < L_SHB_LAHEAD + 10; i++ ) - { - L_tmp = L_shl( shb_synth_nonref_fx[L_SHB_LAHEAD + 10 + i], shift_prev_pow ); - curr_pow_fx = L_add( curr_pow_fx, Mpy_32_32( L_tmp, L_tmp ) ); - } - - IF( EQ_32( prev_pow_fx, 0 ) ) - { - e_scale_fx = 0; - move16(); - scale_fx = 0; - move16(); - } - ELSE - { - e_scale_fx = 0; - move16(); - scale_fx = BASOP_Util_Divide3232_Scale( curr_pow_fx, prev_pow_fx, &e_scale_fx ); - scale_fx = Sqrt16( scale_fx, &e_scale_fx ); - } - IF( LT_16( e_scale_fx, 0 ) ) - { - scale_fx = shl( scale_fx, e_scale_fx ); - e_scale_fx = 0; - move16(); - } - FOR( i = 0; i < L_SHB_LAHEAD; i++ ) - { - shb_synth_nonref_fx[i] = Mpy_32_16_1( shb_synth_nonref_fx[i], scale_fx ); - move32(); - } - tmp = 3276; - move16(); - FOR( ; i < L_SHB_LAHEAD + 10; i++ ) - { - IF( EQ_16( e_scale_fx, 0 ) ) - { - temp1_fx = 32767; - move16(); - } - ELSE - { - temp1_fx = shl( 1, sub( 15, e_scale_fx ) ); - move16(); - } - L_tmp = L_mult0( tmp, temp1_fx ); - L_tmp = L_mac0( L_tmp, sub( 32767, tmp ), scale_fx ); - shb_synth_nonref_fx[i] = Mpy_32_16_1( shb_synth_nonref_fx[i], shl( round_fx( L_tmp ), 1 ) ); - move32(); - IF( LT_16( tmp, 29492 ) ) - { - tmp = add( tmp, 3276 ); - } - } - - /* spec and gs adjustment */ - Q_syn_shb = sub( Q_syn_shb, e_scale_fx ); - Scale_sig32( shb_synth_nonref_fx + L_SHB_LAHEAD + 10, L_FRAME16k - 10, -e_scale_fx ); - - tmp = 31; - move16(); - tmp = FindScale( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, Q_syn_shb, tmp ); - temp1_fx = norm_l( hStereoICBWE->memShbSpecMapping_fx ); - IF( EQ_32( hStereoICBWE->memShbSpecMapping_fx, 0 ) ) - { - temp1_fx = 31; - move16(); - } - temp1_fx = add( temp1_fx, hStereoICBWE->prev_Q_memshbspec ); - tmp = s_min( temp1_fx, tmp ); - - tmp = sub( tmp, 9 ); - - Scale_sig32( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, tmp - Q_syn_shb ); - hStereoICBWE->memShbSpecMapping_fx = L_shl( hStereoICBWE->memShbSpecMapping_fx, sub( tmp, hStereoICBWE->prev_Q_memshbspec ) ); - - hStereoICBWE->prev_Q_memshbspec = tmp; - move16(); - Q_syn_shb = tmp; - move16(); - - deemph_fx_32( 0, shb_synth_nonref_fx + L_SHB_LAHEAD, specMapping_fx, L_FRAME16k, &( hStereoICBWE->memShbSpecMapping_fx ) ); - hStereoICBWE->prev_Q_memshbspec = Q_syn_shb; - move16(); - Copy32( shb_synth_nonref_fx + L_FRAME16k, hStereoICBWE->mem_syn_shb_nonref_fx, L_SHB_LAHEAD ); - hStereoICBWE->prev_Q_syn_shb_nonref = Q_syn_shb; - move16(); - - tmp = 31; - move16(); - tmp = FindScale( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, Q_syn_shb, tmp ); - tmp = FindScale( hStereoICBWE->mem_syn_shb_ola_nonref_fx, L_SHB_LAHEAD, hStereoICBWE->prev_Q_syn_shb_ola_nonref, tmp ); - - tmp = sub( tmp, 3 ); - - Scale_sig32( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, tmp - Q_syn_shb ); - Scale_sig32( hStereoICBWE->mem_syn_shb_ola_nonref_fx, L_SHB_LAHEAD, tmp - hStereoICBWE->prev_Q_syn_shb_ola_nonref ); - - ScaleShapedSHB_32( SHB_OVERLAP_LEN, shb_synth_nonref_fx, hStereoICBWE->mem_syn_shb_ola_nonref_fx, hStereoICBWE->gshapeRef_fx, ( Mpy_32_16_1( L_shl( hStereoICBWE->gFrameRef_fx, 1 ), mult_r( gsMapping_fx, 29492 ) ) ), window_shb_fx, subwin_shb_fx, &tmp, &temp1_fx ); - - hStereoICBWE->prev_Q_syn_shb_ola_nonref = tmp; - move16(); - Q_syn_shb = tmp; - move16(); - - IF( EQ_16( st->extl, FB_TBE ) ) - { - v_multc_fixed_16_16( fb_synth_ref_fx, gsMapping_fx, fb_synth_nonref_fx, L_FRAME48k ); - } - - /* generate 32kHz SHB synthesis from 12.8(16)kHz signal */ - - tmp = 31; - move16(); - tmp = FindScale( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, Q_syn_shb, tmp ); - tmp = FindScale( hStereoICBWE->memShbHilbert_nonref_fx, HILBERT_MEM_SIZE, hStereoICBWE->prev_Q_hilb, tmp ); - tmp = FindScale( hStereoICBWE->memShbInterp_nonref_fx, 2 * ALLPASSSECTIONS_STEEP + 1, hStereoICBWE->prev_Q_interp, tmp ); - - tmp = sub( tmp, 3 ); - - Scale_sig32( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, sub( tmp, Q_syn_shb ) ); - Scale_sig32( hStereoICBWE->memShbHilbert_nonref_fx, HILBERT_MEM_SIZE, sub( tmp, hStereoICBWE->prev_Q_hilb ) ); - Scale_sig32( hStereoICBWE->memShbInterp_nonref_fx, 2 * ALLPASSSECTIONS_STEEP + 1, sub( tmp, hStereoICBWE->prev_Q_interp ) ); - - hStereoICBWE->prev_Q_hilb = tmp; - move16(); - hStereoICBWE->prev_Q_interp = tmp; - move16(); - - Q_syn_shb = tmp; - move16(); - - GenSHBSynth_fx_32( shb_synth_nonref_fx, error_fx, hStereoICBWE->memShbHilbert_nonref_fx, hStereoICBWE->memShbInterp_nonref_fx, st->L_frame, &( hStereoICBWE->syn_dm_phase_nonref ) ); - } - ELSE - { - Copy32( synthRef_fx, synth_fx, output_frame ); - - winLen_fx = extract_l( Mpy_32_16_1( st->output_Fs, 41 ) ); - winSlope_fx = div_s( 1, winLen_fx ); - alpha_fx = winSlope_fx; - move16(); - - - IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) - { - ratio_L_fx = 16384; - move16(); - } - ELSE - { - ratio_L_fx = extract_h( tdm_ratio_tabl_fx[hCPE->hStereoTD->tdm_last_ratio_idx] ); - move16(); - } - - icbweM2Ref_fx = gsMapping_fx; - move16(); - IF( hStereoICBWE->refChanIndx_bwe == L_CH_INDX ) - { - - IF( GE_16( ratio_L_fx, 3276 ) ) - { - tmp = mult_r( sub( 32767, ratio_L_fx ), sub( 32767, ratio_L_fx ) ); // Q15 - tmp = mult_r( tmp, gsMapping_fx ); // Q14 - tmp = mult_r( tmp, gsMapping_fx ); // Q13 - IF( LT_16( tmp, 4096 ) ) - { - temp1_fx = 0; - move16(); - temp2_fx = 0; - move16(); - tmp = shl( tmp, 2 ); - icbweM2Ref_fx = Sqrt16( sub( 16384, tmp ), &temp1_fx ); - icbweM2Ref_fx = BASOP_Util_Divide1616_Scale( icbweM2Ref_fx, ratio_L_fx, &temp2_fx ); - icbweM2Ref_fx = shl( icbweM2Ref_fx, add( temp2_fx, sub( temp1_fx, 1 ) ) ); // Q14 - } - ELSE - { - icbweM2Ref_fx = 0; - move16(); - } - } - } - ELSE - { - IF( LE_16( ratio_L_fx, 29490 ) ) - { -#ifdef FIX_TMP_714 - tmp = mult_r( ratio_L_fx, ratio_L_fx ); // Q15 -#else - tmp = mult_r( sub( 32767, ratio_L_fx ), sub( 32767, ratio_L_fx ) ); // Q15 -#endif - tmp = mult_r( tmp, gsMapping_fx ); // Q14 - tmp = mult_r( tmp, gsMapping_fx ); // Q13 - IF( LT_16( tmp, 4096 ) ) - { - temp1_fx = 0; - move16(); - temp2_fx = 0; - move16(); - tmp = shl( tmp, 2 ); - icbweM2Ref_fx = Sqrt16( sub( 16384, tmp ), &temp1_fx ); - icbweM2Ref_fx = BASOP_Util_Divide1616_Scale( icbweM2Ref_fx, sub( 32767, ratio_L_fx ), &temp2_fx ); - icbweM2Ref_fx = shl( icbweM2Ref_fx, add( temp2_fx, sub( temp1_fx, 1 ) ) ); // Q14 - } - ELSE - { - icbweM2Ref_fx = 0; - move16(); - } - } - } - - icbweM2Ref_fx = s_max( gsMapping_fx, icbweM2Ref_fx ); - - FOR( i = 0; i < winLen_fx; i++ ) - { - L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); - L_tmp = L_mac0( L_tmp, sub( 32767, alpha_fx ), hStereoICBWE->icbweM2Ref_prev_fx ); - tmp = shl( round_fx( L_tmp ), 1 ); - synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp ); - move32(); - L_tmp = L_mult0( alpha_fx, gsMapping_fx ); - L_tmp = L_mac0( L_tmp, sub( 32767, alpha_fx ), prevgsMapping_fx ); - tmp = shl( round_fx( L_tmp ), 1 ); - synth_fx[i] = Mpy_32_16_1( synth_fx[i], tmp ); - move32(); - IF( LE_16( alpha_fx, sub( 32767, winSlope_fx ) ) ) - { - alpha_fx = add( alpha_fx, winSlope_fx ); - } - } - FOR( ; i < NS2SA( st->output_Fs, FRAME_SIZE_NS ); i++ ) - { - synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], icbweM2Ref_fx ); - move32(); - synth_fx[i] = Mpy_32_16_1( synth_fx[i], gsMapping_fx ); - move32(); - } - hStereoICBWE->icbweM2Ref_prev_fx = icbweM2Ref_fx; - move16(); - - ic_bwe_dec_reset_fx( hStereoICBWE ); - hStereoICBWE->prevSpecMapping_fx = 0; - move16(); - - *Q_syn = sub( *Q_syn, 1 ); - - return; - } - - /* resample to output FS */ - - - IF( EQ_32( st->output_Fs, 48000 ) ) - { - tmp = 31; - move16(); - tmp = FindScale( error_fx, L_FRAME32k, Q_syn_shb, tmp ); - tmp = FindScale( hStereoICBWE->memShb_fsout_nonref_fx, INTERP_3_2_MEM_LEN, hStereoICBWE->prev_Q_fsout, tmp ); - tmp = sub( tmp, 4 ); - - Scale_sig32( error_fx, L_FRAME32k, sub( tmp, Q_syn_shb ) ); - Scale_sig32( hStereoICBWE->memShb_fsout_nonref_fx, INTERP_3_2_MEM_LEN, sub( tmp, hStereoICBWE->prev_Q_fsout ) ); - interpolate_3_over_2_allpass_32( error_fx, L_FRAME32k, synth_fx, hStereoICBWE->memShb_fsout_nonref_fx ); - hStereoICBWE->prev_Q_fsout = tmp; - move16(); - } - ELSE IF( EQ_32( st->output_Fs, 32000 ) ) - { - Copy32( error_fx, synth_fx, L_FRAME32k ); - } - ELSE IF( EQ_32( st->output_Fs, 16000 ) ) - { - tmp = 31; - move16(); - tmp = FindScale( error_fx, L_FRAME32k, Q_syn_shb, tmp ); - tmp = FindScale( hStereoICBWE->memShb_fsout_nonref_fx, INTERP_3_2_MEM_LEN, hStereoICBWE->prev_Q_fsout, tmp ); - tmp = sub( tmp, 4 ); - - Scale_sig32( error_fx, L_FRAME32k, sub( tmp, Q_syn_shb ) ); - Scale_sig32( hStereoICBWE->memShb_fsout_nonref_fx, INTERP_3_2_MEM_LEN, sub( tmp, hStereoICBWE->prev_Q_fsout ) ); - Decimate_allpass_steep_fx32( error_fx, hStereoICBWE->memShb_fsout_nonref_fx, L_FRAME32k, synth_fx ); - hStereoICBWE->prev_Q_fsout = tmp; - move16(); - } -#ifndef MSAN_FIX - Scale_sig32( synth_fx, L_FRAME48k, sub( *Q_syn, add( 1, tmp ) ) ); -#else - Scale_sig32( synth_fx, output_frame, sub( *Q_syn, add( 1, tmp ) ) ); -#endif - - *Q_syn = sub( *Q_syn, 1 ); - - test(); - IF( EQ_16( st->extl, FB_TBE ) && EQ_32( st->output_Fs, 48000 ) ) - { - - // v_add( fb_synth_nonref_fx, synth_fx, synth_fx, L_FRAME48k, 0 ); - FOR( i = 0; i < L_FRAME48k; i++ ) - { - synth_fx[i] = L_add( synth_fx[i], L_deposit_l( fb_synth_nonref_fx[i] ) ); - move32(); - } - } - - /* copy to outputHB and reset hb_synth values */ - - IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) - { - ratio_L_fx = 16384; - move16(); - } - ELSE - { - ratio_L_fx = extract_h( tdm_ratio_tabl_fx[hCPE->hStereoTD->tdm_last_ratio_idx] ); - move16(); - } - - icbweM2Ref_fx = gsMapping_fx; - move16(); - IF( hStereoICBWE->refChanIndx_bwe == L_CH_INDX ) - { - IF( GE_16( ratio_L_fx, 3276 ) ) - { - tmp = mult_r( sub( 32767, ratio_L_fx ), sub( 32767, ratio_L_fx ) ); // Q15 - tmp = mult_r( tmp, gsMapping_fx ); // Q14 - tmp = mult_r( tmp, gsMapping_fx ); // Q13 - IF( LT_16( tmp, 4096 ) ) - { - temp1_fx = 0; - move16(); - temp2_fx = 0; - move16(); - tmp = shl( tmp, 2 ); - icbweM2Ref_fx = Sqrt16( sub( 16384, tmp ), &temp1_fx ); - icbweM2Ref_fx = BASOP_Util_Divide1616_Scale( icbweM2Ref_fx, ratio_L_fx, &temp2_fx ); - icbweM2Ref_fx = shl( icbweM2Ref_fx, add( temp1_fx, sub( temp2_fx, 1 ) ) ); // Q14 - } - ELSE - { - icbweM2Ref_fx = 0; - move16(); - } - } - } - ELSE - { - IF( LE_16( ratio_L_fx, 29490 ) ) - { -#ifdef FIX_TMP_714 - tmp = mult_r( ratio_L_fx, ratio_L_fx ); // Q15 -#else - tmp = mult_r( sub( 32767, ratio_L_fx ), sub( 32767, ratio_L_fx ) ); // Q15 -#endif - tmp = mult_r( tmp, gsMapping_fx ); // Q14 - tmp = mult_r( tmp, gsMapping_fx ); // Q13 - IF( LT_16( tmp, 4096 ) ) - { - temp1_fx = 0; - move16(); - temp2_fx = 0; - move16(); - tmp = shl( tmp, 2 ); - icbweM2Ref_fx = Sqrt16( sub( 16384, tmp ), &temp1_fx ); - icbweM2Ref_fx = BASOP_Util_Divide1616_Scale( icbweM2Ref_fx, sub( 32767, ratio_L_fx ), &temp2_fx ); - icbweM2Ref_fx = shl( icbweM2Ref_fx, add( temp2_fx, sub( temp1_fx, 1 ) ) ); // Q14 - } - ELSE - { - icbweM2Ref_fx = 0; - move16(); - } - } - } - - icbweM2Ref_fx = s_max( gsMapping_fx, icbweM2Ref_fx ); - - winLen_fx = extract_l( Mpy_32_16_1( st->output_Fs, 41 ) ); - winSlope_fx = div_s( 1, winLen_fx ); - alpha_fx = winSlope_fx; - move16(); - FOR( i = 0; i < winLen_fx; i++ ) - { - L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); - L_tmp = L_mac0( L_tmp, sub( 32767, alpha_fx ), hStereoICBWE->icbweM2Ref_prev_fx ); - tmp = shl( round_fx( L_tmp ), 1 ); - synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp ); - move32(); - IF( LE_16( alpha_fx, sub( 32767, winSlope_fx ) ) ) - { - alpha_fx = add( alpha_fx, winSlope_fx ); - } - } - - FOR( ; i < NS2SA( st->output_Fs, FRAME_SIZE_NS ); i++ ) - { - synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], icbweM2Ref_fx ); - move32(); - } - - hStereoICBWE->icbweM2Ref_prev_fx = icbweM2Ref_fx; - move16(); - - return; -} -#endif - -/*-------------------------------------------------------------------* - * stereo_icBWE_decproc() - * - * Stereo (inter-channel) BWE mapping - decoder initialization - *-------------------------------------------------------------------*/ - -#ifndef IVAS_FLOAT_FIXED -void stereo_icBWE_decproc( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - float *output[CPE_CHANNELS], /* i/o: output synthesis */ - float outputHB[CPE_CHANNELS][L_FRAME48k], /* i : HB synthesis */ - const int16_t last_core, /* i : last core, primary channel */ - const int16_t last_bwidth, /* i : last bandwidth */ - const int16_t output_frame /* i : frame length */ -) -{ - int16_t i, j, n, decoderDelay, icbweOLASize, dftOvlLen; - int16_t core, memOffset, refChanIndx_bwe; - float temp0[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )], temp1[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )]; - float winSlope, alpha; - const float *win_dft; - int32_t extl_brate, output_Fs; - - STEREO_ICBWE_DEC_HANDLE hStereoICBWE = hCPE->hStereoICBWE; - - - /*--------------------------------------------------------------------* - * skip IC-BWE in case of SID or NO_DATA frame - * -------------------------------------------------------------------*/ - - if ( ( hCPE->element_mode == IVAS_CPE_TD || hCPE->element_mode == IVAS_CPE_DFT ) && hCPE->nchan_out == 2 /*&& hCPE->hCoreCoder[0]->core_brate > SID_2k40*/ && hCPE->hCoreCoder[0]->last_core_brate <= SID_2k40 ) - { - stereo_icBWE_init_dec( hCPE->hStereoICBWE ); - } - - if ( hCPE->hCoreCoder[0]->core_brate <= SID_2k40 ) - { - return; - } - - /*--------------------------------------------------------------------* - * skip IC-BWE in case of mono DMX output * - * -------------------------------------------------------------------*/ - - if ( hCPE->nchan_out == 1 && hCPE->element_mode == IVAS_CPE_DFT ) - { - add_HB_to_mono_dmx( hCPE, output[0], outputHB[0], last_core, output_frame ); - - return; - } - else if ( hCPE->nchan_out == 1 && hCPE->element_mode != IVAS_CPE_TD ) - { - return; - } - - /*--------------------------------------------------------------------* - * IC-BWE processing - * -------------------------------------------------------------------*/ - - core = hCPE->hCoreCoder[0]->core; - extl_brate = hCPE->hCoreCoder[0]->extl_brate; - output_Fs = hCPE->hCoreCoder[0]->output_Fs; - - memOffset = NS2SA( output_Fs, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); - - /* LRTD stereo mode - 2xBWEs used */ - if ( hCPE->element_mode == IVAS_CPE_TD && hCPE->hCoreCoder[0]->tdm_LRTD_flag ) - { - /* delay HB synth */ - for ( n = 0; n < CPE_CHANNELS; n++ ) - { - mvr2r( outputHB[n] + output_frame - memOffset, temp0, memOffset ); - mvr2r( outputHB[n], outputHB[n] + memOffset, output_frame - memOffset ); - mvr2r( hCPE->prev_hb_synth[n], outputHB[n], memOffset ); - mvr2r( temp0, hCPE->prev_hb_synth[n], memOffset ); - } - - if ( hCPE->nchan_out == 1 ) - { - /* stereo to mono downmix */ - for ( i = 0; i < output_frame; i++ ) - { - outputHB[0][i] = ( outputHB[0][i] + outputHB[1][i] ) * 0.5f; - } - v_add( output[0], outputHB[0], output[0], output_frame ); - } - else - { - /* Add the delayed hb_synth component to the delayed ACELP synthesis */ - for ( n = 0; n < CPE_CHANNELS; n++ ) - { - v_add( output[n], outputHB[n], output[n], output_frame ); - } - } - } - else - { - for ( n = 0; n < CPE_CHANNELS; n++ ) - { - set_f( hCPE->prev_hb_synth[n], 0, memOffset ); - } - } - - if ( hCPE->element_mode != IVAS_CPE_MDCT && !( hCPE->element_mode == IVAS_CPE_TD && hCPE->hCoreCoder[0]->tdm_LRTD_flag ) ) - { - if ( hCPE->last_element_mode == IVAS_CPE_MDCT ) - { - set_f( hStereoICBWE->memOutHB[0], 0, memOffset ); - set_f( hStereoICBWE->memOutHB[1], 0, memOffset ); - - set_f( hStereoICBWE->memTransitionHB[0], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); - set_f( hStereoICBWE->memTransitionHB[1], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); - } - - if ( core == ACELP_CORE && extl_brate > 0 ) - { - refChanIndx_bwe = hStereoICBWE->refChanIndx_bwe; - - if ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->hCoreCoder[0]->bwidth > WB && last_bwidth == WB && hCPE->hCoreCoder[0]->ini_frame > 1 /* counter wass already updated */ ) - { - /* fad-in reference HB signal */ - winSlope = ( memOffset > 0 ) ? ( 1.0f / memOffset ) : 0; - for ( i = 0; i < memOffset; i++ ) - { - outputHB[refChanIndx_bwe][i] *= ( i + 1 ) * winSlope; - } - } - /* Resampled LB and HB offset */ - mvr2r( outputHB[refChanIndx_bwe], temp0 + memOffset, output_frame - memOffset ); - mvr2r( outputHB[!refChanIndx_bwe], temp1 + memOffset, output_frame - memOffset ); - - decoderDelay = NS2SA( output_Fs, IVAS_DEC_DELAY_NS ); - - if ( last_core != ACELP_CORE && hCPE->element_mode == IVAS_CPE_DFT ) - { - /* hb_synth of mid band is faded out in the 1.25 ms prior to DFT analysis and the icbwe is faded in time domain */ - icbweOLASize = NS2SA( output_Fs, STEREO_DFT_DELAY_DEC_BWE_NS ); - - for ( i = 0; i < decoderDelay; i++ ) - { - temp0[i] = 0; - temp1[i] = 0; - } - - assert( icbweOLASize > 0 ); - winSlope = 1.0f / icbweOLASize; - alpha = winSlope; - for ( ; i < decoderDelay + icbweOLASize; i++ ) - { - temp0[i] *= alpha; - temp1[i] *= alpha; - alpha += winSlope; - } - } - else - { - if ( refChanIndx_bwe != hStereoICBWE->prev_refChanIndx_bwe ) - { - winSlope = ( memOffset > 0 ) ? ( 1.0f / memOffset ) : 0; - for ( i = 0; i < memOffset; i++ ) - { - temp0[i] = ( ( i + 1 ) * winSlope ) * hStereoICBWE->memOutHB[refChanIndx_bwe][i] + - ( 1 - ( i + 1 ) * winSlope ) * hStereoICBWE->memOutHB[hStereoICBWE->prev_refChanIndx_bwe][i]; - temp1[i] = ( ( i + 1 ) * winSlope ) * hStereoICBWE->memOutHB[hStereoICBWE->prev_refChanIndx_bwe][i] + - ( 1 - ( i + 1 ) * winSlope ) * hStereoICBWE->memOutHB[refChanIndx_bwe][i]; - } - } - else - { - mvr2r( hStereoICBWE->memOutHB[refChanIndx_bwe], temp0, memOffset ); - mvr2r( hStereoICBWE->memOutHB[!refChanIndx_bwe], temp1, memOffset ); - } - } - - if ( hCPE->nchan_out == 1 ) - { - /* stereo to mono downmix */ - for ( i = 0; i < output_frame; i++ ) - { - temp0[i] = ( temp0[i] + temp1[i] ) * 0.5f; - output[0][i] += temp0[i]; - } - } - else - { - - v_add( temp0, output[0], output[0], output_frame ); - v_add( temp1, output[1], output[1], output_frame ); - } - mvr2r( outputHB[0] + output_frame - memOffset, hStereoICBWE->memOutHB[0], memOffset ); - mvr2r( outputHB[1] + output_frame - memOffset, hStereoICBWE->memOutHB[1], memOffset ); - - if ( hCPE->element_mode == IVAS_CPE_DFT ) - { - win_dft = hCPE->hStereoDft->win32ms; - dftOvlLen = hCPE->hStereoDft->dft32ms_ovl; - - /* Preparing buffers in anticipation of an ACELP to TCX switch */ - j = 0; - for ( i = 0; i < memOffset; i++ ) - { - hStereoICBWE->memTransitionHB[0][i] = hStereoICBWE->memOutHB[0][i] * win_dft[STEREO_DFT32MS_STEP * ( dftOvlLen - 1 - j )]; - hStereoICBWE->memTransitionHB[1][i] = hStereoICBWE->memOutHB[1][i] * win_dft[STEREO_DFT32MS_STEP * ( dftOvlLen - 1 - j )]; - j++; - } - - for ( i = 0; j < dftOvlLen; i++ ) - { - hStereoICBWE->memTransitionHB[0][memOffset + i] = outputHB[0][output_frame - i - 1] * win_dft[STEREO_DFT32MS_STEP * ( dftOvlLen - 1 - j )]; - hStereoICBWE->memTransitionHB[1][memOffset + i] = outputHB[1][output_frame - i - 1] * win_dft[STEREO_DFT32MS_STEP * ( dftOvlLen - 1 - j )]; - j++; - } - } - - hStereoICBWE->prev_refChanIndx_bwe = refChanIndx_bwe; - } - else - { - if ( last_core == ACELP_CORE ) - { - if ( hCPE->element_mode == IVAS_CPE_TD ) - { - v_add( output[0], hStereoICBWE->memOutHB[hStereoICBWE->prev_refChanIndx_bwe], output[0], memOffset ); - v_add( output[1], hStereoICBWE->memOutHB[!hStereoICBWE->prev_refChanIndx_bwe], output[1], memOffset ); - } - else - { - /* This is generated in the ACELP frame and windowed. This process is akin to GenTransition for IC-BWE */ - v_add( output[0], hStereoICBWE->memTransitionHB[hStereoICBWE->prev_refChanIndx_bwe], output[0], NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); - v_add( output[1], hStereoICBWE->memTransitionHB[!hStereoICBWE->prev_refChanIndx_bwe], output[1], NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); - } - - set_f( hStereoICBWE->memOutHB[0], 0, memOffset ); - set_f( hStereoICBWE->memOutHB[1], 0, memOffset ); - - set_f( hStereoICBWE->memTransitionHB[0], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); - set_f( hStereoICBWE->memTransitionHB[1], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); - } - } - } - else if ( hCPE->element_mode == IVAS_CPE_TD && hCPE->hCoreCoder[0]->tdm_LRTD_flag && hStereoICBWE != NULL ) - { - stereo_icBWE_init_dec( hCPE->hStereoICBWE ); - } - else if ( hCPE->element_mode == IVAS_CPE_MDCT && hCPE->last_element_mode == IVAS_CPE_DFT && last_core == ACELP_CORE ) - { - int16_t delay_tdbwe = NS2SA( output_Fs, DELAY_BWE_TOTAL_NS ); - - for ( n = 0; n < hCPE->nchan_out; n++ ) - { - for ( i = 0; i < delay_tdbwe; i++ ) - { - output[n][NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) - delay_tdbwe + i] += outputHB[0][i]; - } - } - /* reset BWE structs as they are only needed in the transition frame in MDCT Stereo */ - td_bwe_dec_init( hCPE->hCoreCoder[0]->hBWE_TD, -1, output_Fs ); - - fd_bwe_dec_init_flt( hCPE->hCoreCoder[0]->hBWE_FD ); - } - - if ( hCPE->element_mode == IVAS_CPE_DFT && ( max( hCPE->hStereoDft->td_gain[0], hCPE->hStereoDft->td_gain[1] ) > 0 ) ) - { - float win_in, win_out, tmp; - - win_dft = hCPE->hStereoDft->win32ms; - dftOvlLen = hCPE->hStereoDft->dft32ms_ovl; - - for ( i = 0; i < dftOvlLen; i++ ) - { - win_in = win_dft[STEREO_DFT32MS_STEP * i] * win_dft[STEREO_DFT32MS_STEP * i]; - win_out = 1 - win_in; - tmp = ( win_in * hCPE->hStereoDft->td_gain[0] + win_out * hCPE->hStereoDft->td_gain[1] ) * hCPE->hStereoDft->hb_stefi_sig[i]; - - output[0][i] += tmp; - output[1][i] -= tmp; - } - for ( i = dftOvlLen; i < output_frame; i++ ) - { - tmp = hCPE->hStereoDft->td_gain[0] * hCPE->hStereoDft->hb_stefi_sig[i]; - output[0][i] += tmp; - output[1][i] -= tmp; - } - } - - return; -} -#else -void stereo_icBWE_decproc_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - Word32 *output[CPE_CHANNELS], /* i/o: output synthesis */ - Word32 outputHB[CPE_CHANNELS][L_FRAME48k], /* i : HB synthesis */ - const Word16 last_core, /* i : last core, primary channel */ - const Word16 last_bwidth, /* i : last bandwidth */ - const Word16 output_frame /* i : frame length */ -#ifndef FIX_826_PRECISION_LOST_AND_COMPL - , - Word16 q_output /* i : Q-fac of output */ -#endif -) -{ - Word16 i, j, n, decoderDelay, icbweOLASize, dftOvlLen; - Word16 core, memOffset, refChanIndx_bwe; - - Word32 temp0_fx[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )], temp1_fx[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )]; -#if defined FIX_826_PRECISION_LOST_AND_COMPL - Word16 winSlope_fx = 0, alpha_fx; -#else - Word32 winSlope_fx = 0, alpha_fx; -#endif - move32(); - const Word16 *win_dft_fx; - Word32 extl_brate, output_Fs; - - STEREO_ICBWE_DEC_HANDLE hStereoICBWE = hCPE->hStereoICBWE; - - /*--------------------------------------------------------------------* - * skip IC-BWE in case of SID or NO_DATA frame - * -------------------------------------------------------------------*/ - - test(); - test(); - test(); - IF( ( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) || EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) && EQ_16( hCPE->nchan_out, 2 ) /*&& hCPE->hCoreCoder[0]->core_brate > SID_2k40*/ && LE_32( hCPE->hCoreCoder[0]->last_core_brate, SID_2k40 ) ) - { - stereo_icBWE_init_dec_fx( hCPE->hStereoICBWE ); - } - - IF( LE_32( hCPE->hCoreCoder[0]->core_brate, SID_2k40 ) ) - { - return; - } - - /*--------------------------------------------------------------------* - * skip IC-BWE in case of mono DMX output * - * -------------------------------------------------------------------*/ - - test(); - test(); - IF( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) - { - add_HB_to_mono_dmx_fx( hCPE, output[0], outputHB[0], last_core, output_frame ); - return; - } - ELSE IF( EQ_16( hCPE->nchan_out, 1 ) && NE_16( hCPE->element_mode, IVAS_CPE_TD ) ) - { - return; - } - - /*--------------------------------------------------------------------* - * IC-BWE processing - * -------------------------------------------------------------------*/ - - core = hCPE->hCoreCoder[0]->core; - move16(); - extl_brate = hCPE->hCoreCoder[0]->extl_brate; - move32(); - output_Fs = hCPE->hCoreCoder[0]->output_Fs; - move32(); - - memOffset = NS2SA( output_Fs, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); - - /* LRTD stereo mode - 2xBWEs used */ - test(); - IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && hCPE->hCoreCoder[0]->tdm_LRTD_flag ) - { - /* delay HB synth */ - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - Copy32( outputHB[n] + output_frame - memOffset, temp0_fx, memOffset ); - Copy32( outputHB[n], outputHB[n] + memOffset, output_frame - memOffset ); - Copy32( hCPE->prev_hb_synth_fx[n], outputHB[n], memOffset ); - Copy32( temp0_fx, hCPE->prev_hb_synth_fx[n], memOffset ); - } - - IF( EQ_16( hCPE->nchan_out, 1 ) ) - { - /* stereo to mono downmix */ - FOR( i = 0; i < output_frame; i++ ) - { -#ifdef FIX_826_PRECISION_LOST_AND_COMPL - outputHB[0][i] = W_extract_h( W_mac_32_16( W_mult_32_16( outputHB[0][i], 16384 ), outputHB[1][i], 16384 ) ); -#else - outputHB[0][i] = L_shr( ( outputHB[0][i] + outputHB[1][i] ), 1 ); -#endif - move32(); - } - v_add_32( output[0], outputHB[0], output[0], output_frame ); - } - ELSE - { - /* Add the delayed hb_synth component to the delayed ACELP synthesis */ - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - v_add_32( output[n], outputHB[n], output[n], output_frame ); - } - } - } - ELSE - { - FOR( n = 0; n < CPE_CHANNELS; n++ ) - { - set32_fx( hCPE->prev_hb_synth_fx[n], 0, memOffset ); - } - } - - test(); - test(); - test(); - test(); - test(); - test(); - IF( NE_16( hCPE->element_mode, IVAS_CPE_MDCT ) && !( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && hCPE->hCoreCoder[0]->tdm_LRTD_flag ) ) - { - IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) ) - { - set32_fx( hStereoICBWE->memOutHB_fx[0], 0, memOffset ); - set32_fx( hStereoICBWE->memOutHB_fx[1], 0, memOffset ); - - set32_fx( hStereoICBWE->memTransitionHB_fx[0], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); - set32_fx( hStereoICBWE->memTransitionHB_fx[1], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); - } - - test(); - IF( EQ_16( core, ACELP_CORE ) && extl_brate > 0 ) - { - refChanIndx_bwe = hStereoICBWE->refChanIndx_bwe; - move16(); - - test(); - test(); - test(); - IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && GT_16( hCPE->hCoreCoder[0]->bwidth, WB ) && EQ_16( last_bwidth, WB ) && GT_16( hCPE->hCoreCoder[0]->ini_frame, 1 ) /* counter wass already updated */ ) - { - /* fad-in reference HB signal */ - IF( GT_16( memOffset, 0 ) ) - { - SWITCH( memOffset ) - { -#if defined FIX_826_PRECISION_LOST_AND_COMPL - case 15: - winSlope_fx = 2185; - move32(); - BREAK; - case 30: - winSlope_fx = 1092; - move32(); - BREAK; - case 45: - winSlope_fx = 728; - move32(); - BREAK; -#else - case 15: - winSlope_fx = 71582792; - move32(); - BREAK; - case 30: - winSlope_fx = 35791396; - move32(); - BREAK; - case 45: - winSlope_fx = 23860930; - move32(); - BREAK; -#endif - } - // memOffset for 16K 32K 48K are 15 30 45 respectively.camera - } - ELSE - { - winSlope_fx = 0; - move32(); - } -#if defined FIX_826_PRECISION_LOST_AND_COMPL - alpha_fx = 0; - move16(); -#endif - FOR( i = 0; i < memOffset; i++ ) - { -#if defined FIX_826_PRECISION_LOST_AND_COMPL - alpha_fx = add_sat( alpha_fx, winSlope_fx ); - outputHB[refChanIndx_bwe][i] = W_round48_L( W_mult_32_16( outputHB[refChanIndx_bwe][i] /* Q11 + Q15 + 1 - 16 = Q11)*/, winSlope_fx ) ); // -#else - Word32 mul_win = Mpy_32_16_1( winSlope_fx, ( i + 1 ) ); // Q30 + Q0 - 15 = Q15 - mul_win = L_shl( mul_win, 15 ); // Q30 - outputHB[refChanIndx_bwe][i] = L_shl( Mpy_32_32( outputHB[refChanIndx_bwe][i] /* Q11 + Q30 - 31 = Q10)*/, mul_win ), 1 ); // -#endif - move32(); - } - } - /* Resampled LB and HB offset */ - Copy32( outputHB[refChanIndx_bwe], temp0_fx + memOffset, sub( output_frame, memOffset ) ); - Copy32( outputHB[!refChanIndx_bwe], temp1_fx + memOffset, sub( output_frame, memOffset ) ); - - decoderDelay = NS2SA( output_Fs, IVAS_DEC_DELAY_NS ); - - test(); - IF( last_core != ACELP_CORE && EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) - { - /* hb_synth of mid band is faded out in the 1.25 ms prior to DFT analysis and the icbwe is faded in time domain */ - icbweOLASize = NS2SA( output_Fs, STEREO_DFT_DELAY_DEC_BWE_NS ); - - FOR( i = 0; i < decoderDelay; i++ ) - { - temp0_fx[i] = 0; - move32(); - temp1_fx[i] = 0; - move32(); - } - - assert( icbweOLASize > 0 ); - SWITCH( icbweOLASize ) - { -#if defined FIX_826_PRECISION_LOST_AND_COMPL - case 60: - winSlope_fx = 546; - move16(); - BREAK; - case 40: - winSlope_fx = 819; - move16(); - BREAK; - case 20: - winSlope_fx = 1638; - move16(); - BREAK; - default: - fprintf( stderr, "icbweOLASize of size %d not implemented \n", icbweOLASize ); - assert( 0 ); - BREAK; -#else - case 60: - winSlope_fx = 17895698; - move32(); - BREAK; - case 40: - winSlope_fx = 26843546; - move32(); - BREAK; - case 20: - winSlope_fx = 53687092; - move32(); - BREAK; -#endif - } - alpha_fx = winSlope_fx; // Q30 - move32(); - FOR( ; i < add( decoderDelay, icbweOLASize ); i++ ) - { -#if defined FIX_826_PRECISION_LOST_AND_COMPL - temp0_fx[i] = W_round48_L( W_mult_32_16( temp0_fx[i], alpha_fx ) ); // Q11 - move32(); - temp1_fx[i] = W_round48_L( W_mult_32_16( temp1_fx[i], alpha_fx ) ); - move32(); - alpha_fx = add_sat( alpha_fx, winSlope_fx ); -#else - temp0_fx[i] = L_shl_sat( Mpy_32_32( temp0_fx[i], alpha_fx ), 1 ); // Q11 - move32(); - temp1_fx[i] = L_shl_sat( Mpy_32_32( temp1_fx[i], alpha_fx ), 1 ); - move32(); - alpha_fx = L_add( alpha_fx, winSlope_fx ); -#endif - } - } - ELSE - { - IF( NE_16( refChanIndx_bwe, hStereoICBWE->prev_refChanIndx_bwe ) ) - { - IF( memOffset > 0 ) - { - SWITCH( memOffset ) - { -#if defined FIX_826_PRECISION_LOST_AND_COMPL - case 15: - winSlope_fx = 2185; - move16(); - BREAK; - case 30: - winSlope_fx = 1092; - move16(); - BREAK; - case 45: - winSlope_fx = 728; - move16(); - BREAK; -#else - case 15: - winSlope_fx = 71582792; - move32(); - BREAK; - case 30: - winSlope_fx = 35791396; - move32(); - BREAK; - case 45: - winSlope_fx = 23860930; // Q30 - move32(); - BREAK; -#endif - } - // memOffset for 16K 32K 48K are 15 30 45 respectively.camera - } - ELSE - { - winSlope_fx = 0; - move32(); - } -#if defined FIX_826_PRECISION_LOST_AND_COMPL - Word16 Incr = 0; - Word16 Decr = MAX_16; -#endif - move16(); - move16(); - FOR( i = 0; i < memOffset; i++ ) - { -#ifndef FIX_826_PRECISION_LOST_AND_COMPL - temp0_fx[i] = L_add( L_shl( Mpy_32_32( Mpy_32_16_1( winSlope_fx, ( i + 1 ) ), hStereoICBWE->memOutHB_fx[refChanIndx_bwe][i] ), 16 ), - L_shl( Mpy_32_32( Mpy_32_16_1( winSlope_fx, 1 - ( i + 1 ) ), hStereoICBWE->memOutHB_fx[hStereoICBWE->prev_refChanIndx_bwe][i] ), 16 ) ); - move32(); - - temp1_fx[i] = L_add( L_shl( Mpy_32_32( Mpy_32_16_1( winSlope_fx, ( i + 1 ) ), hStereoICBWE->memOutHB_fx[hStereoICBWE->prev_refChanIndx_bwe][i] ), 16 ), - L_shl( Mpy_32_32( Mpy_32_16_1( winSlope_fx, ( 1 - ( i + 1 ) ) ), hStereoICBWE->memOutHB_fx[refChanIndx_bwe][i] ), 16 ) ); -#else - Incr = add_sat( Incr, winSlope_fx ); - Decr = sub( Decr, winSlope_fx ); - temp0_fx[i] = W_round48_L( W_mac_32_16( W_mult_32_16( hStereoICBWE->memOutHB_fx[refChanIndx_bwe][i], Incr ), hStereoICBWE->memOutHB_fx[hStereoICBWE->prev_refChanIndx_bwe][i], Decr ) ); - temp1_fx[i] = W_round48_L( W_mac_32_16( W_mult_32_16( hStereoICBWE->memOutHB_fx[hStereoICBWE->prev_refChanIndx_bwe][i], Incr ), hStereoICBWE->memOutHB_fx[refChanIndx_bwe][i], Decr ) ); -#endif - move32(); - } - } - ELSE - { - Copy32( hStereoICBWE->memOutHB_fx[refChanIndx_bwe], temp0_fx, memOffset ); - Copy32( hStereoICBWE->memOutHB_fx[!refChanIndx_bwe], temp1_fx, memOffset ); - } - } - - IF( EQ_16( hCPE->nchan_out, 1 ) ) - { -#ifdef FIX_826_PRECISION_LOST_AND_COMPL - Word64 W_tmp; -#endif - /* stereo to mono downmix */ - FOR( i = 0; i < output_frame; i++ ) - { -#ifndef FIX_826_PRECISION_LOST_AND_COMPL - temp0_fx[i] = L_add( temp0_fx[i], temp1_fx[i] ); - move32(); - temp0_fx[i] = L_shr( temp0_fx[i], 1 ); - move32(); - output[0][i] = L_add( output[0][i], temp0_fx[i] ); -#else - W_tmp = W_mult_32_16( output[0][i], 32767 ); - W_tmp = W_mac_32_16( W_tmp, temp0_fx[i], 16384 ); - output[0][i] = W_round48_L( W_mac_32_16( W_tmp, temp1_fx[i], 16384 ) ); - move32(); - -#endif - move32(); - } - } - ELSE - { - v_add_32( temp0_fx, output[0], output[0], output_frame ); - v_add_32( temp1_fx, output[1], output[1], output_frame ); - } - - Copy32( outputHB[0] + output_frame - memOffset, hStereoICBWE->memOutHB_fx[0], memOffset ); - Copy32( outputHB[1] + output_frame - memOffset, hStereoICBWE->memOutHB_fx[1], memOffset ); - - IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) - { - /*win_dft = hCPE->hStereoDft->win32ms;*/ - win_dft_fx = hCPE->hStereoDft->win32ms_fx; - dftOvlLen = hCPE->hStereoDft->dft32ms_ovl; - move16(); - - /* Preparing buffers in anticipation of an ACELP to TCX switch */ - -#ifndef FIX_826_PRECISION_LOST_AND_COMPL - j = 0; - move16(); -#else - j = sub( dftOvlLen, 1 ); -#endif - FOR( i = 0; i < memOffset; i++ ) - { -#ifndef FIX_826_PRECISION_LOST_AND_COMPL - Word16 tmp_mul = mult0( STEREO_DFT32MS_STEP, ( sub( dftOvlLen, add( 1, j ) ) ) ); - hStereoICBWE->memTransitionHB_fx[0][i] = Mpy_32_16_1( hStereoICBWE->memOutHB_fx[0][i], win_dft_fx[tmp_mul] ); - move32(); - hStereoICBWE->memTransitionHB_fx[1][i] = Mpy_32_16_1( hStereoICBWE->memOutHB_fx[1][i], win_dft_fx[tmp_mul] ); - move32(); - j = add( j, 1 ); -#else - Word16 tmp_mul = i_mult( STEREO_DFT32MS_STEP, j ); - hStereoICBWE->memTransitionHB_fx[0][i] = Mpy_32_16_1( hStereoICBWE->memOutHB_fx[0][i], win_dft_fx[tmp_mul] ); - move32(); - hStereoICBWE->memTransitionHB_fx[1][i] = Mpy_32_16_1( hStereoICBWE->memOutHB_fx[1][i], win_dft_fx[tmp_mul] ); - move32(); - j = sub( j, 1 ); -#endif - } - -#if !defined FIX_826_PRECISION_LOST_AND_COMPL || defined FIX_833_CORRECTION_to_826 - FOR( i = 0; j < dftOvlLen; i++ ) -#else - FOR( i = 0; i < dftOvlLen; i++ ) -#endif - { -#if !defined FIX_826_PRECISION_LOST_AND_COMPL || defined FIX_833_CORRECTION_to_826 - Word16 tmp_mul = mult0( STEREO_DFT32MS_STEP, ( sub( dftOvlLen, add( 1, j ) ) ) ); - hStereoICBWE->memTransitionHB_fx[0][memOffset + i] = Mpy_32_16_1( outputHB[0][output_frame - i - 1], win_dft_fx[tmp_mul] ); - move32(); - hStereoICBWE->memTransitionHB_fx[1][memOffset + i] = Mpy_32_16_1( outputHB[1][output_frame - i - 1], win_dft_fx[tmp_mul] ); - move32(); - j = add( j, 1 ); -#else - Word16 tmp_mul = i_mult( STEREO_DFT32MS_STEP, j ); - hStereoICBWE->memTransitionHB_fx[0][memOffset + i] = Mpy_32_16_1( outputHB[0][output_frame - i - 1], win_dft_fx[tmp_mul] ); - move32(); - hStereoICBWE->memTransitionHB_fx[1][memOffset + i] = Mpy_32_16_1( outputHB[1][output_frame - i - 1], win_dft_fx[tmp_mul] ); - move32(); - j = sub( j, 1 ); -#endif - } - } - - hStereoICBWE->prev_refChanIndx_bwe = refChanIndx_bwe; - move16(); - } - ELSE - { - IF( last_core == ACELP_CORE ) - { - IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) ) - { - v_add_32( output[0], hStereoICBWE->memOutHB_fx[hStereoICBWE->prev_refChanIndx_bwe], output[0], memOffset ); - v_add_32( output[1], hStereoICBWE->memOutHB_fx[!hStereoICBWE->prev_refChanIndx_bwe], output[1], memOffset ); - } - ELSE - { - /* This is generated in the ACELP frame and windowed. This process is akin to GenTransition for IC-BWE */ - v_add_32( output[0], hStereoICBWE->memTransitionHB_fx[hStereoICBWE->prev_refChanIndx_bwe], output[0], NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); - v_add_32( output[1], hStereoICBWE->memTransitionHB_fx[!hStereoICBWE->prev_refChanIndx_bwe], output[1], NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); - } - - set32_fx( hStereoICBWE->memOutHB_fx[0], 0, memOffset ); - set32_fx( hStereoICBWE->memOutHB_fx[1], 0, memOffset ); - - set32_fx( hStereoICBWE->memTransitionHB_fx[0], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); - set32_fx( hStereoICBWE->memTransitionHB_fx[1], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); - } - } - } - ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && hCPE->hCoreCoder[0]->tdm_LRTD_flag && hStereoICBWE != NULL ) - { - stereo_icBWE_init_dec_fx( hCPE->hStereoICBWE ); - } - ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) && EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) && EQ_16( last_core, ACELP_CORE ) ) - { - Word16 delay_tdbwe = NS2SA( output_Fs, DELAY_BWE_TOTAL_NS ); - - FOR( n = 0; n < hCPE->nchan_out; n++ ) - { - FOR( i = 0; i < delay_tdbwe; i++ ) - { - output[n][NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) - delay_tdbwe + i] = L_add_sat( output[n][NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) - delay_tdbwe + i], outputHB[0][i] ); - move32(); - } - } - /* reset BWE structs as they are only needed in the transition frame in MDCT Stereo */ - td_bwe_dec_init_ivas_fx( hCPE->hCoreCoder[0], hCPE->hCoreCoder[0]->hBWE_TD, output_Fs ); - fd_bwe_dec_init( hCPE->hCoreCoder[0], hCPE->hCoreCoder[0]->hBWE_FD ); - } - - test(); - IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && GT_32( L_max( hCPE->hStereoDft->td_gain_fx[0], hCPE->hStereoDft->td_gain_fx[1] ), 0 ) ) - { -#ifdef FIX_826_PRECISION_LOST_AND_COMPL - Word32 win_in_fx, win_out_fx, tmp_fx; - Word64 W_tmp, W_tmp1; -#else - Word32 win_in_fx, win_out_fx, tmp_fx, gain0_fx, gain1_fx; -#endif - win_dft_fx = hCPE->hStereoDft->win32ms_fx; - dftOvlLen = hCPE->hStereoDft->dft32ms_ovl; - move16(); - - // Scale_sig32(hCPE->hStereoDft->td_gain_fx, STEREO_DFT_CORE_HIST_MAX, -12); - - FOR( i = 0; i < dftOvlLen; i++ ) - { -#ifdef FIX_826_PRECISION_LOST_AND_COMPL - j = i_mult( STEREO_DFT32MS_STEP, i ); - win_in_fx = L_mult( win_dft_fx[j], win_dft_fx[j] ); /* Q31 */ - win_out_fx = L_sub( ONE_IN_Q31, win_in_fx ); /* Q31 */ - /* hCPE->hStereoDft->q_hb_stefi_sig_fx is always 31 here */ - /* tmp = ( win_in * hCPE->hStereoDft->td_gain[0] + win_out * hCPE->hStereoDft->td_gain[1] ) * hCPE->hStereoDft->hb_stefi_sig[i]; */ - - W_tmp = W_mult_32_32( hCPE->hStereoDft->td_gain_fx[0], win_in_fx ); - if ( hCPE->hStereoDft->q_td_gain[0] != 0 ) - { - W_tmp = W_shl( W_tmp, sub( 31, hCPE->hStereoDft->q_td_gain[0] ) ); - } - W_tmp1 = W_mult_32_32( hCPE->hStereoDft->td_gain_fx[1], win_out_fx ); - if ( hCPE->hStereoDft->q_td_gain[1] != 0 ) - { - W_tmp1 = W_shl( W_tmp1, sub( 31, hCPE->hStereoDft->q_td_gain[1] ) ); - } - tmp_fx = W_extract_h( W_add_nosat( W_tmp, W_tmp1 ) ); - tmp_fx = W_extract_h( W_mult_32_32( tmp_fx, hCPE->hStereoDft->hb_stefi_sig_fx[i] ) ); - - output[0][i] = L_add_sat( output[0][i], tmp_fx ); - move32(); - output[1][i] = L_sub_sat( output[1][i], tmp_fx ); - move32(); -#else - win_in_fx = L_mult( win_dft_fx[mult0( STEREO_DFT32MS_STEP, i )], win_dft_fx[mult0( STEREO_DFT32MS_STEP, i )] ); /* Q31 */ - win_out_fx = L_sub( ONE_IN_Q31, win_in_fx ); /* Q31 */ - - gain0_fx = Mpy_32_32( win_in_fx, hCPE->hStereoDft->td_gain_fx[0] ); /* Q --> q_td_gain[0] */ -#ifdef FIX_736_BWE_SECT_C - gain0_fx = (Word32) W_shr( ( (Word64) gain0_fx * hCPE->hStereoDft->hb_stefi_sig_fx[i] ), sub( add( (Word16) hCPE->hStereoDft->q_td_gain[0], hCPE->hStereoDft->q_hb_stefi_sig_fx ), 2 * q_output + 14 ) ); /* Q --> q_output */ - gain1_fx = Mpy_32_32( win_out_fx, hCPE->hStereoDft->td_gain_fx[1] ); /* Q --> q_td_gain[1] */ - gain1_fx = (Word32) W_shr( ( (Word64) gain1_fx * hCPE->hStereoDft->hb_stefi_sig_fx[i] ), sub( add( (Word16) hCPE->hStereoDft->q_td_gain[1], hCPE->hStereoDft->q_hb_stefi_sig_fx ), 2 * q_output + 14 ) ); /* Q --> q_output */ -#else - gain0_fx = (Word32) W_shr( ( (Word64) gain0_fx * hCPE->hStereoDft->hb_stefi_sig_fx[i] ), sub( add( (Word16) hCPE->hStereoDft->q_td_gain[0], hCPE->hStereoDft->q_hb_stefi_sig_fx ), q_output ) ); /* Q --> q_output */ - gain1_fx = Mpy_32_32( win_out_fx, hCPE->hStereoDft->td_gain_fx[1] ); /* Q --> q_td_gain[1] */ - gain1_fx = (Word32) W_shr( ( (Word64) gain1_fx * hCPE->hStereoDft->hb_stefi_sig_fx[i] ), sub( add( (Word16) hCPE->hStereoDft->q_td_gain[1], hCPE->hStereoDft->q_hb_stefi_sig_fx ), q_output ) ); /* Q --> q_output */ -#endif - tmp_fx = L_add_sat( gain0_fx, gain1_fx ); /* Q --> q_output */ - - output[0][i] = L_add_sat( output[0][i], tmp_fx ); - move32(); - output[1][i] = L_sub_sat( output[1][i], tmp_fx ); - move32(); -#endif - } - FOR( i = dftOvlLen; i < output_frame; i++ ) - { -#ifdef FIX_826_PRECISION_LOST_AND_COMPL - tmp_fx = W_extract_h( W_mult_32_32( hCPE->hStereoDft->td_gain_fx[0], hCPE->hStereoDft->hb_stefi_sig_fx[i] ) ); /* Q11 --> Q11 */ -#else -#ifdef FIX_736_BWE_SECT_C - tmp_fx = (Word32) W_shr( ( (Word64) hCPE->hStereoDft->td_gain_fx[0] * hCPE->hStereoDft->hb_stefi_sig_fx[i] ), sub( add( (Word16) hCPE->hStereoDft->q_td_gain[0], hCPE->hStereoDft->q_hb_stefi_sig_fx ), 2 * q_output + 14 ) ); /* Q --> q_output */ -#else - tmp_fx = (Word32) W_shr( ( (Word64) hCPE->hStereoDft->td_gain_fx[0] * hCPE->hStereoDft->hb_stefi_sig_fx[i] ), sub( add( (Word16) hCPE->hStereoDft->q_td_gain[0], hCPE->hStereoDft->q_hb_stefi_sig_fx ), q_output ) ); /* Q --> q_output */ -#endif -#endif - output[0][i] = L_add_sat( output[0][i], tmp_fx ); - move32(); - output[1][i] = L_sub_sat( output[1][i], tmp_fx ); - move32(); - } - } - - return; -} -#endif - -/*-------------------------------------------------------------------* - * stereo_icBWE_init_dec() - * - * Stereo (inter-channel) BWE mapping - decoder initialization - *-------------------------------------------------------------------*/ - -#ifndef IVAS_FLOAT_FIXED -void stereo_icBWE_init_dec( - STEREO_ICBWE_DEC_HANDLE hStereoICBWE /* i/o: Stereo inter-channel BWE handle */ -) -{ - /* BWE ref channel */ - hStereoICBWE->refChanIndx_bwe = L_CH_INDX; - hStereoICBWE->prev_refChanIndx_bwe = L_CH_INDX; - - /* SHB output memory */ - set_f( hStereoICBWE->memOutHB[0], 0, NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) ); - set_f( hStereoICBWE->memOutHB[1], 0, NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) ); - - - /* SHB output memory */ - set_f( hStereoICBWE->memTransitionHB[0], 0, NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) ); - set_f( hStereoICBWE->memTransitionHB[1], 0, NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) ); - - /* inter-channel BWE spectral shape adj. */ - hStereoICBWE->prevSpecMapping = 0; - hStereoICBWE->prevgsMapping = 1.0f; - - hStereoICBWE->icbweM2Ref_prev = 1.0f; - - hStereoICBWE->prev_spIndx = 0; - hStereoICBWE->prev_gsIndx = 0; - - ic_bwe_dec_reset( hStereoICBWE ); - return; -} -#else -void stereo_icBWE_init_dec_fx( - STEREO_ICBWE_DEC_HANDLE hStereoICBWE /* i/o: Stereo inter-channel BWE handle */ -) -{ - /* BWE ref channel */ - hStereoICBWE->refChanIndx_bwe = L_CH_INDX; - move16(); - hStereoICBWE->prev_refChanIndx_bwe = L_CH_INDX; - move16(); - - /* SHB output memory */ - set32_fx( hStereoICBWE->memOutHB_fx[0], 0, NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) ); - set32_fx( hStereoICBWE->memOutHB_fx[1], 0, NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) ); - - - /* SHB output memory */ - set32_fx( hStereoICBWE->memTransitionHB_fx[0], 0, NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) ); - set32_fx( hStereoICBWE->memTransitionHB_fx[1], 0, NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) ); - - /* inter-channel BWE spectral shape adj. */ - hStereoICBWE->prevSpecMapping_fx = 0; - move16(); - hStereoICBWE->prevgsMapping_fx = 16384; - move16(); - hStereoICBWE->icbweM2Ref_prev_fx = 16384; - move16(); - - hStereoICBWE->prev_spIndx = 0; - move16(); - hStereoICBWE->prev_gsIndx = 0; - move16(); - - ic_bwe_dec_reset_fx( hStereoICBWE ); - - return; -} -#endif +/****************************************************************************************************** + + (C) 2022-2024 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository. All Rights Reserved. + + This software is protected by copyright law and by international treaties. + The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB, + Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD., + Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange, + Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other + contributors to this repository retain full ownership rights in their respective contributions in + the software. This notice grants no license of any kind, including but not limited to patent + license, nor is any license granted by implication, estoppel or otherwise. + + Contributors are required to enter into the IVAS codec Public Collaboration agreement before making + contributions. + + This software is provided "AS IS", without any express or implied warranties. The software is in the + development stage. It is intended exclusively for experts who have experience with such software and + solely for the purpose of inspection. All implied warranties of non-infringement, merchantability + and fitness for a particular purpose are hereby disclaimed and excluded. + + Any dispute, controversy or claim arising under or in relation to providing this software shall be + submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in + accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and + the United Nations Convention on Contracts on the International Sales of Goods. + +*******************************************************************************************************/ + +#include +#include +#include "options.h" +#include +#include "cnst.h" +#include "ivas_cnst.h" +#include "prot.h" +#include "prot_fx.h" +#include "ivas_prot.h" +#include "ivas_prot_fx.h" +#include "wmc_auto.h" +#include "rom_com.h" +#include "ivas_rom_com.h" +#ifdef IVAS_FLOAT_FIXED +#include "ivas_rom_com_fx.h" +#endif + + +#define Q_icBWE 16 + +/*-------------------------------------------------------------------* + * ic_bwe_dec_reset() + * + * core switching reset of IC BWE memory + *-------------------------------------------------------------------*/ + +#ifndef IVAS_FLOAT_FIXED +static void ic_bwe_dec_reset( + STEREO_ICBWE_DEC_HANDLE hStereoICBWE /* i/o: Stereo ICBWE handle */ +) +{ + /* unscaled & scaled SHB synthesis memory */ + set_f( hStereoICBWE->mem_syn_shb_nonref, 0, L_SHB_LAHEAD ); /* use samples from !acelp) */ + set_f( hStereoICBWE->mem_lpc_shbsynth_nonref, 0, LPC_SHB_ORDER ); + set_f( hStereoICBWE->mem_syn_shb_ola_nonref, 0, L_SHB_LAHEAD ); /* use samples from !acelp) */ + + /* inter-channel BWE SP and GSP mem reset */ + hStereoICBWE->memShbSpecMapping = 0; + + set_f( hStereoICBWE->memShbHilbert_nonref, 0, HILBERT_MEM_SIZE ); + set_f( hStereoICBWE->memShbInterp_nonref, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + set_f( hStereoICBWE->memShb_fsout_nonref, 0, INTERP_3_2_MEM_LEN ); + hStereoICBWE->syn_dm_phase_nonref = 0; + + return; +} +#else +static void ic_bwe_dec_reset_fx( + STEREO_ICBWE_DEC_HANDLE hStereoICBWE /* i/o: Stereo ICBWE handle */ +) +{ + /* unscaled & scaled SHB synthesis memory */ + set32_fx( hStereoICBWE->mem_syn_shb_nonref_fx, 0, L_SHB_LAHEAD ); /* use samples from !acelp) */ + set32_fx( hStereoICBWE->mem_lpc_shbsynth_nonref_fx, 0, LPC_SHB_ORDER ); + set32_fx( hStereoICBWE->mem_syn_shb_ola_nonref_fx, 0, L_SHB_LAHEAD ); /* use samples from !acelp) */ + + hStereoICBWE->prev_Q_syn_shb_nonref = 31; + move16(); + hStereoICBWE->prev_Q_lpc_shbsynth_nonref = 31; + move16(); + hStereoICBWE->prev_Q_syn_shb_ola_nonref = 31; + move16(); + + /* inter-channel BWE SP and GSP mem reset */ + hStereoICBWE->memShbSpecMapping_fx = 0; + move32(); + hStereoICBWE->prev_Q_memshbspec = 31; + move16(); + + set32_fx( hStereoICBWE->memShbHilbert_nonref_fx, 0, HILBERT_MEM_SIZE ); + set32_fx( hStereoICBWE->memShbInterp_nonref_fx, 0, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); + set32_fx( hStereoICBWE->memShb_fsout_nonref_fx, 0, INTERP_3_2_MEM_LEN ); + + hStereoICBWE->prev_Q_hilb = 31; + move16(); + hStereoICBWE->prev_Q_interp = 31; + move16(); + hStereoICBWE->prev_Q_fsout = 31; + move16(); + + hStereoICBWE->syn_dm_phase_nonref = 0; + move16(); + + return; +} +#endif + + +#ifndef IVAS_FLOAT_FIXED +/*-------------------------------------------------------------------* + * stereo_icBWE_dec() + * + * Spatial mapping of reference to the non-reference channels in SHB + *-------------------------------------------------------------------*/ + +void stereo_icBWE_dec( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float *synthRef, /* i/o: Reference channel HB synthesis at output Fs */ + float *synth, /* o : Non reference channel HB synthesis at output Fs */ + const float *fb_synth_ref, /* i : ref. high-band synthesis 16-20 kHz */ + const float *voice_factors, /* i : voicing factors */ + const int16_t output_frame /* i : frame length */ +) +{ + int16_t i, j, k, nbSubFr; + Decoder_State *st; /* i/o: decoder state structure, primary channel */ + int16_t spIndx, gsIndx; + float excSHB_nonref[L_FRAME16k]; + float shb_synth_nonref[L_FRAME16k + L_SHB_LAHEAD]; + float error[L_FRAME32k]; + float nlMixFac[NB_SUBFR16k]; + float gsMapping, specMapping; + float fb_synth_nonref[L_FRAME48k]; + float scale, prev_pow, curr_pow, temp; + float alpha, winSlope, winLen, prevgsMapping; + float temp1, temp2; + float icbweM2Ref, ratio_L; + + STEREO_DFT_DEC_DATA_HANDLE hStereoDft = hCPE->hStereoDft; + STEREO_ICBWE_DEC_HANDLE hStereoICBWE = hCPE->hStereoICBWE; + st = hCPE->hCoreCoder[0]; + + /*--------------------------------------------------------------------* + * skip IC-BWE in case of mono DMX output * + * -------------------------------------------------------------------*/ + + if ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->nchan_out == 1 && hCPE->hStereoDft->hConfig->res_cod_mode > STEREO_DFT_RES_COD_OFF ) + { + hCPE->hStereoDft->core_hist[0] = st->core; + + return; + } + else if ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->nchan_out == 1 ) + { + + return; + } + + /*--------------------------------------------------------------------* + * skip IC-BWE in case of SID or NO_DATA frame + * -------------------------------------------------------------------*/ + + if ( st->core_brate <= SID_2k40 ) + { + return; + } + + /*--------------------------------------------------------------------* + * TD high band stereo filling * + * -------------------------------------------------------------------*/ + + /* update buffers for TD stereo filling */ + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + float hb_nrg = EPSILON; + float hb_nrg2 = EPSILON; + + if ( st->core == ACELP_CORE || st->last_core == ACELP_CORE ) + { + for ( i = 0; i < output_frame / 2; i++ ) + { + hb_nrg2 += synthRef[i] * synthRef[i]; + } + + hCPE->hStereoDft->hb_nrg_subr[0] = hb_nrg2; + hb_nrg += hb_nrg2; + hb_nrg2 = EPSILON; + + for ( ; i < output_frame; i++ ) + { + hb_nrg2 += synthRef[i] * synthRef[i]; + } + + hCPE->hStereoDft->hb_nrg_subr[1] = hb_nrg2; + hb_nrg += hb_nrg2; + + mvr2r( synthRef, hCPE->hStereoDft->hb_stefi_sig + hCPE->hStereoDft->hb_stefi_delay, output_frame ); + } + else + { + set_zero( hCPE->hStereoDft->hb_stefi_sig + hCPE->hStereoDft->hb_stefi_delay, output_frame ); + } + hCPE->hStereoDft->hb_nrg_subr[0] *= hCPE->hStereoDft->NFFT / 2; + hCPE->hStereoDft->hb_nrg_subr[1] *= hCPE->hStereoDft->NFFT / 2; + hCPE->hStereoDft->hb_nrg[0] = hb_nrg; + hCPE->hStereoDft->td_gain[0] = 0; + hCPE->hStereoDft->core_hist[0] = st->core; + } + + /*--------------------------------------------------------------------* + * IC-BWE * + * -------------------------------------------------------------------*/ + + if ( st->core != ACELP_CORE || st->extl == -1 || ( hCPE->element_mode == IVAS_CPE_TD && hCPE->hCoreCoder[0]->tdm_LRTD_flag ) ) + { + return; + } + else if ( hCPE->element_mode == IVAS_CPE_DFT && st->core_brate <= SID_2k40 ) + { + mvr2r( synthRef, synth, output_frame ); + return; + } + + + set_f( fb_synth_nonref, 0, L_FRAME48k ); + + /* core switching reset */ + if ( st->last_core != ACELP_CORE || st->bwidth == WB ) + { + ic_bwe_dec_reset( hStereoICBWE ); + + if ( st->last_core != ACELP_CORE ) + { + hStereoICBWE->prevSpecMapping = 0.0f; + hStereoICBWE->prevgsMapping = 1.0f; + hStereoICBWE->icbweM2Ref_prev = 1.0f; + } + + if ( st->bwidth == WB ) + { + /* copy to outputHB and reset hb_synth values */ + mvr2r( synthRef, synth, output_frame ); + + if ( st->element_mode == IVAS_CPE_TD ) + { + hStereoICBWE->prevSpecMapping = 0.0f; + hStereoICBWE->prevgsMapping = 1.0f; + hStereoICBWE->icbweM2Ref_prev = 1.0f; + } + else if ( st->element_mode == IVAS_CPE_DFT ) + { + hStereoICBWE->refChanIndx_bwe = L_CH_INDX; + hStereoICBWE->prevSpecMapping = 0.0f; + + prevgsMapping = hStereoICBWE->prevgsMapping; + temp1 = hStereoDft->side_gain[2 * STEREO_DFT_BAND_MAX + hStereoDft->nbands - 1]; + icbweM2Ref = 1.f + temp1; + gsMapping = 1.f - temp1; + + winLen = (int16_t) ( ( SHB_OVERLAP_LEN * st->output_Fs ) / 16000 ); + winSlope = 1.0f / winLen; + alpha = winSlope; + for ( i = 0; i < winLen; i++ ) + { + synthRef[i] *= ( alpha * ( icbweM2Ref ) + ( 1.0f - alpha ) * ( hStereoICBWE->icbweM2Ref_prev ) ); + synth[i] *= ( alpha * ( gsMapping ) + ( 1.0f - alpha ) * ( prevgsMapping ) ); + alpha += winSlope; + } + for ( ; i < NS2SA( st->output_Fs, FRAME_SIZE_NS ); i++ ) + { + synthRef[i] *= ( icbweM2Ref ); + synth[i] *= ( gsMapping ); + } + hStereoICBWE->icbweM2Ref_prev = icbweM2Ref; + hStereoICBWE->prevgsMapping = gsMapping; + } + + return; + } + } + + if ( !st->bfi ) + { + hStereoICBWE->refChanIndx_bwe = get_next_indice( st, STEREO_ICBWE_REFBITS ); + if ( st->flag_ACELP16k == 1 ) + { + spIndx = get_next_indice( st, STEREO_ICBWE_SPBITS ); + } + else + { + spIndx = 3; + } + if ( st->element_mode == IVAS_CPE_TD ) + { + gsIndx = get_next_indice( st, STEREO_ICBWE_GSBITS ); + } + else + { + gsIndx = get_next_indice( st, STEREO_ICBWE_GSBITS_DFT ); + } + + /* Store indices in case of frame loss */ + hStereoICBWE->prev_spIndx = spIndx; + hStereoICBWE->prev_gsIndx = gsIndx; + } + else /*bfi*/ + { + /* Retrieve last decoded indices */ + spIndx = hStereoICBWE->prev_spIndx; + gsIndx = hStereoICBWE->prev_gsIndx; + hStereoICBWE->refChanIndx_bwe = hStereoICBWE->prev_refChanIndx_bwe; + } + + /* IC-BWE parameter de-quant */ + /* sp Mapping */ + hStereoICBWE->prevSpecMapping = usdequant( spIndx, -0.6f, 0.2f ); + + /* gs Mapping */ + prevgsMapping = hStereoICBWE->prevgsMapping; + + if ( st->element_mode == IVAS_CPE_TD ) + { + hStereoICBWE->prevgsMapping = icbwe_gsMapping_tbl[gsIndx]; + } + else + { + hStereoICBWE->prevgsMapping = icbwe_gsMappingDFT_tbl[gsIndx]; + } + + hStereoICBWE->prevgsMapping = powf( 10, hStereoICBWE->prevgsMapping ); + + specMapping = hStereoICBWE->prevSpecMapping; + gsMapping = hStereoICBWE->prevgsMapping; + + if ( ( st->extl == SWB_TBE || st->extl == FB_TBE ) && st->flag_ACELP16k == 1 ) + { + mvr2r( voice_factors, nlMixFac, NB_SUBFR16k ); + if ( hCPE->hStereoDftDmx != NULL ) + { + if ( hCPE->hStereoDftDmx->targetGain < 0.5f || hCPE->hStereoDftDmx->targetGain > 2.0f ) + { + v_multc( voice_factors, 0.5f, nlMixFac, NB_SUBFR16k ); + } + } + else + { + if ( hCPE->hStereoTCA->targetGain < 0.5f || hCPE->hStereoTCA->targetGain > 2.0f ) + { + v_multc( voice_factors, 0.5f, nlMixFac, NB_SUBFR16k ); + } + } + + nbSubFr = ( st->flag_ACELP16k == 0 ) ? NB_SUBFR : NB_SUBFR16k; + for ( i = 0, k = 0; i < nbSubFr; i++ ) + { + if ( hCPE->hCoreCoder[0]->coder_type == UNVOICED || hStereoICBWE->MSFlag == 1 ) + { + temp1 = 0; + temp2 = 1.0f; + } + else + { + temp1 = sqrtf( nlMixFac[i] ); + temp2 = sqrtf( 1.0f - nlMixFac[i] ); + } + + for ( j = 0; j < L_FRAME16k / nbSubFr; j++, k++ ) + { + excSHB_nonref[k] = temp1 * hStereoICBWE->nlExc16k[k] + temp2 * hStereoICBWE->mixExc16k[k]; + } + } + + /* LP synthesis */ + mvr2r( hStereoICBWE->mem_syn_shb_nonref, shb_synth_nonref, L_SHB_LAHEAD ); + syn_filt( hStereoICBWE->lpSHBRef, LPC_SHB_ORDER, excSHB_nonref, shb_synth_nonref + L_SHB_LAHEAD, L_FRAME16k, hStereoICBWE->mem_lpc_shbsynth_nonref, 1 ); + + prev_pow = sum2_f( shb_synth_nonref, L_SHB_LAHEAD + 10 ); + curr_pow = sum2_f( shb_synth_nonref + L_SHB_LAHEAD + 10, L_SHB_LAHEAD + 10 ); + + if ( prev_pow == 0 ) + { + scale = 0; + } + else + { + scale = sqrtf( curr_pow / prev_pow ); + } + + for ( i = 0; i < L_SHB_LAHEAD; i++ ) + { + shb_synth_nonref[i] *= scale; + } + + for ( ; i < L_SHB_LAHEAD + 10; i++ ) + { + temp = ( i - 19 ) / 10.0f; + shb_synth_nonref[i] *= ( temp * 1.0f + ( 1.0f - temp ) * scale ); + } + /* spec and gs adjustment */ + deemph( shb_synth_nonref + L_SHB_LAHEAD, specMapping, L_FRAME16k, &( hStereoICBWE->memShbSpecMapping ) ); + mvr2r( shb_synth_nonref + L_FRAME16k, hStereoICBWE->mem_syn_shb_nonref, L_SHB_LAHEAD ); + + ScaleShapedSHB( SHB_OVERLAP_LEN, shb_synth_nonref, hStereoICBWE->mem_syn_shb_ola_nonref, hStereoICBWE->gshapeRef, ( hStereoICBWE->gFrameRef * gsMapping * 0.9f ), window_shb, subwin_shb ); + + if ( st->extl == FB_TBE ) + { + v_multc( fb_synth_ref, gsMapping, fb_synth_nonref, L_FRAME48k ); + } + + /* generate 32kHz SHB synthesis from 12.8(16)kHz signal */ + GenSHBSynth( shb_synth_nonref, error, hStereoICBWE->memShbHilbert_nonref, hStereoICBWE->memShbInterp_nonref, st->L_frame, &( hStereoICBWE->syn_dm_phase_nonref ) ); + } + else + { + mvr2r( synthRef, synth, output_frame ); + + winLen = (int16_t) ( ( SHB_OVERLAP_LEN * st->output_Fs ) / 16000 ); + winSlope = 1.0f / winLen; + alpha = winSlope; + + ratio_L = ( hCPE->element_mode == IVAS_CPE_DFT ) ? ( 0.5f ) : ( tdm_ratio_tabl[hCPE->hStereoTD->tdm_last_ratio_idx] ); + + icbweM2Ref = gsMapping; + if ( hStereoICBWE->refChanIndx_bwe == L_CH_INDX ) + { + if ( ratio_L >= 0.1f ) + { + icbweM2Ref = sqrtf( 0.5f - min( 0.5f, ( 1 - ratio_L ) * ( 1 - ratio_L ) * gsMapping * gsMapping ) ) / ratio_L; + } + } + else + { + if ( ratio_L <= 0.9f ) + { + icbweM2Ref = sqrtf( 0.5f - min( 0.5f, ratio_L * ratio_L * gsMapping * gsMapping ) ) / ( 1 - ratio_L ); + } + } + + icbweM2Ref = max( gsMapping, icbweM2Ref ); + + for ( i = 0; i < winLen; i++ ) + { + synthRef[i] *= ( alpha * ( icbweM2Ref ) + ( 1.0f - alpha ) * ( hStereoICBWE->icbweM2Ref_prev ) ); + synth[i] *= ( alpha * ( gsMapping ) + ( 1.0f - alpha ) * ( prevgsMapping ) ); + alpha += winSlope; + } + for ( ; i < NS2SA( st->output_Fs, FRAME_SIZE_NS ); i++ ) + { + synthRef[i] *= ( icbweM2Ref ); + synth[i] *= ( gsMapping ); + } + hStereoICBWE->icbweM2Ref_prev = icbweM2Ref; + + ic_bwe_dec_reset( hStereoICBWE ); + hStereoICBWE->prevSpecMapping = 0.0f; + + return; + } + + /* resample to output FS */ + if ( st->output_Fs == 48000 ) + { + interpolate_3_over_2_allpass( error, L_FRAME32k, synth, hStereoICBWE->memShb_fsout_nonref ); + } + else if ( st->output_Fs == 32000 ) + { + mvr2r( error, synth, L_FRAME32k ); + } + else if ( st->output_Fs == 16000 ) + { + Decimate_allpass_steep( error, hStereoICBWE->memShb_fsout_nonref, L_FRAME32k, synth ); + } + + + if ( st->extl == FB_TBE && st->output_Fs == 48000 ) + { + v_add( fb_synth_nonref, synth, synth, L_FRAME48k ); + } + + /* copy to outputHB and reset hb_synth values */ + ratio_L = ( hCPE->element_mode == IVAS_CPE_DFT ) ? ( 0.5f ) : ( tdm_ratio_tabl[hCPE->hStereoTD->tdm_last_ratio_idx] ); + + icbweM2Ref = gsMapping; + if ( hStereoICBWE->refChanIndx_bwe == L_CH_INDX ) + { + if ( ratio_L >= 0.1f ) + { + icbweM2Ref = sqrtf( 0.5f - min( 0.5f, ( 1 - ratio_L ) * ( 1 - ratio_L ) * gsMapping * gsMapping ) ) / ratio_L; + } + } + else + { + if ( ratio_L <= 0.9f ) + { + icbweM2Ref = sqrtf( 0.5f - min( 0.5f, ratio_L * ratio_L * gsMapping * gsMapping ) ) / ( 1 - ratio_L ); + } + } + + icbweM2Ref = max( gsMapping, icbweM2Ref ); + + winLen = (int16_t) ( ( SHB_OVERLAP_LEN * st->output_Fs ) / 16000 ); + winSlope = 1.0f / winLen; + alpha = winSlope; + for ( i = 0; i < winLen; i++ ) + { + synthRef[i] *= ( alpha * ( icbweM2Ref ) + ( 1.0f - alpha ) * ( hStereoICBWE->icbweM2Ref_prev ) ); + alpha += winSlope; + } + + for ( ; i < NS2SA( st->output_Fs, FRAME_SIZE_NS ); i++ ) + { + synthRef[i] *= ( icbweM2Ref ); + } + + hStereoICBWE->icbweM2Ref_prev = icbweM2Ref; + + return; +} +#else +static Word16 FindScale( + Word32 *buff, + Word16 len, + Word16 Q_buff, + Word16 Q_prev ) +{ + Word32 maxVal; + Word16 norm_shift, Q_out; + + maximum_abs_32_fx( buff, len, &maxVal ); + norm_shift = norm_l( maxVal ); + if ( maxVal == 0 ) + { + norm_shift = 31; + move16(); + } + + Q_out = s_min( Q_prev, add( Q_buff, norm_shift ) ); + + return Q_out; +} + + +void stereo_icBWE_dec_fx( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word32 *synthRef_fx, /* i/o: Reference channel HB synthesis at output Fs Q11 */ + Word32 *synth_fx, /* o : Non reference channel HB synthesis at output Fs Q11 */ + const Word16 *fb_synth_ref_fx, /* i : ref. high-band synthesis 16-20 kHz Q11 */ + const Word16 *voice_factors_fx, /* i : voicing factors Q15 */ + const Word16 output_frame, /* i : frame length */ + Word16 *Q_syn /* i : Q of synth and synthRef buffers */ +) +{ + Word16 i, j, k, nbSubFr; + Decoder_State *st; /* i/o: decoder state structure, primary channel */ + Word16 spIndx, gsIndx; + Word32 excSHB_nonref_fx[L_FRAME16k]; + Word32 shb_synth_nonref_fx[L_FRAME16k + L_SHB_LAHEAD]; + Word32 error_fx[L_FRAME32k]; + Word16 nlMixFac_fx[NB_SUBFR16k]; + Word16 specMapping_fx; + Word16 fb_synth_nonref_fx[L_FRAME48k]; + Word32 prev_pow_fx, curr_pow_fx, maxVal1, maxVal; + Word16 scale_fx, e_scale_fx; + Word16 alpha_fx, winSlope_fx, winLen_fx; + Word16 prevgsMapping_fx; + Word16 temp1_fx, temp2_fx; + Word16 icbweM2Ref_fx, ratio_L_fx; + Word16 gsMapping_fx; +#ifndef FIX_826_PRECISION_LOST_AND_COMPL + Word32 hb_nrg_fx, hb_nrg2_fx; +#else + Word32 hb_nrg_fx; +#endif + Word16 Q_syn_shb; + Word16 shift_prev_pow, synthRef_shift; + Word32 L_tmp; + Word16 tmp; + Word32 L_nlExc16k, L_mixExc16k; + + STEREO_DFT_DEC_DATA_HANDLE hStereoDft = hCPE->hStereoDft; + STEREO_ICBWE_DEC_HANDLE hStereoICBWE = hCPE->hStereoICBWE; + st = hCPE->hCoreCoder[0]; + + /*--------------------------------------------------------------------* + * skip IC-BWE in case of mono DMX output * + * -------------------------------------------------------------------*/ + + test(); + test(); + test(); + IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && EQ_16( hCPE->nchan_out, 1 ) && GT_16( hCPE->hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) ) + { + hCPE->hStereoDft->core_hist[0] = st->core; + move16(); + + return; + } + ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && EQ_16( hCPE->nchan_out, 1 ) ) + { + return; + } + + /*--------------------------------------------------------------------* + * skip IC-BWE in case of SID or NO_DATA frame + * -------------------------------------------------------------------*/ + + IF( LE_32( st->core_brate, SID_2k40 ) ) + { + return; + } + + /*--------------------------------------------------------------------* + * TD high band stereo filling * + * -------------------------------------------------------------------*/ + + /* update buffers for TD stereo filling */ + IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) + { + hb_nrg_fx = 0; + move32(); +#ifndef FIX_826_PRECISION_LOST_AND_COMPL + hb_nrg2_fx = 0; +#endif + move32(); + maximum_abs_32_fx( synthRef_fx, output_frame, &maxVal ); + synthRef_shift = norm_l( maxVal ); + if ( maxVal == 0 ) + { + synthRef_shift = 31; + move16(); + } +#ifndef FIX_826_PRECISION_LOST_AND_COMPL /* Not needed Q11 is already enough */ + synthRef_shift = sub( synthRef_shift, shr( add( find_guarded_bits_fx( output_frame ), 1 ), 1 ) ); +#else + synthRef_shift = sub( synthRef_shift, shr( add( find_guarded_bits_fx( shr( output_frame, 1 ) ), 1 ), 1 ) ); +#endif + test(); + IF( EQ_16( st->core, ACELP_CORE ) || EQ_16( st->last_core, ACELP_CORE ) ) + { +#ifdef FIX_826_PRECISION_LOST_AND_COMPL + Word64 W_tmp = 0; + move64(); + tmp = shl_sat( 1, synthRef_shift ); +#endif + FOR( i = 0; i < shr( output_frame, 1 ); i++ ) + { + // needed to be adjusted for q +#ifndef FIX_826_PRECISION_LOST_AND_COMPL + L_tmp = L_shl( synthRef_fx[i], synthRef_shift ); + hb_nrg2_fx = L_add( hb_nrg2_fx, Mpy_32_32( L_tmp, L_tmp ) ); // 2*(Qx + SynthRef_shift) - 31 +#else + L_tmp = Mpy_32_16_1( synthRef_fx[i], tmp ); + W_tmp = W_mac_32_32( W_tmp, L_tmp, L_tmp ); +#endif + } +#ifdef FIX_826_PRECISION_LOST_AND_COMPL + hb_nrg_fx = W_round48_L( W_tmp ); + hCPE->hStereoDft->hb_nrg_subr_fx[0] = hb_nrg_fx; + move32(); + hStereoDft->q_hb_nrg_subr = sub( shl( add( *Q_syn, synthRef_shift ), 1 ), 45 ); + move16(); + W_tmp = 0; + move64(); + FOR( ; i < output_frame; i++ ) + { + L_tmp = Mpy_32_16_1( synthRef_fx[i], tmp ); + W_tmp = W_mac_32_32( W_tmp, L_tmp, L_tmp ); + } + + hCPE->hStereoDft->hb_nrg_subr_fx[1] = W_round48_L( W_tmp ); // 2*(Qx + SynthRef_shift) - 45 + hb_nrg_fx = L_add( hCPE->hStereoDft->hb_nrg_subr_fx[0], hCPE->hStereoDft->hb_nrg_subr_fx[1] ); +#else + hCPE->hStereoDft->hb_nrg_subr_fx[0] = hb_nrg2_fx; + move32(); + hStereoDft->q_hb_nrg_subr = sub( add( *Q_syn, synthRef_shift ), 31 ); + hb_nrg_fx = L_add( hb_nrg_fx, hb_nrg2_fx ); + hb_nrg2_fx = 0; + move32(); + + FOR( ; i < output_frame; i++ ) + { + L_tmp = L_shl( synthRef_fx[i], synthRef_shift ); + hb_nrg2_fx = L_add( hb_nrg2_fx, Mpy_32_32( L_tmp, L_tmp ) ); + } + + hCPE->hStereoDft->hb_nrg_subr_fx[1] = hb_nrg2_fx; // 2*(Qx + SynthRef_shift) - 31 + move32(); + hb_nrg_fx = L_add( hb_nrg_fx, hb_nrg2_fx ); +#endif + + + Copy32( synthRef_fx, hCPE->hStereoDft->hb_stefi_sig_fx + hCPE->hStereoDft->hb_stefi_delay, output_frame ); +#ifndef FIX_826_PRECISION_LOST_AND_COMPL + Scale_sig32( hCPE->hStereoDft->hb_stefi_sig_fx + hCPE->hStereoDft->hb_stefi_delay, output_frame, -5 ); +#endif + } + ELSE + { + set32_fx( hCPE->hStereoDft->hb_stefi_sig_fx + hCPE->hStereoDft->hb_stefi_delay, 0, output_frame ); +#ifdef MSAN_FIX + hCPE->hStereoDft->hb_nrg_subr_fx[0] = 0; + move32(); + hCPE->hStereoDft->hb_nrg_subr_fx[1] = 0; + move32(); +#endif // MSAN_FIX + } + hCPE->hStereoDft->hb_nrg_subr_fx[0] = ( Mpy_32_16_1( hCPE->hStereoDft->hb_nrg_subr_fx[0], shl( hCPE->hStereoDft->NFFT / 2, 6 ) ) ); // 2 * (Qx + SynthRef_shift) - 40 // 2 * (Qx + SynthRef_shift) - 31 - 15 + move32(); + hCPE->hStereoDft->hb_nrg_subr_fx[1] = ( Mpy_32_16_1( hCPE->hStereoDft->hb_nrg_subr_fx[1], shl( hCPE->hStereoDft->NFFT / 2, 6 ) ) ); // 2 * (Qx + SynthRef_shift) - 40 + move32(); +#ifndef FIX_826_PRECISION_LOST_AND_COMPL + hCPE->hStereoDft->q_hb_nrg_subr = sub( shl( ( *Q_syn + synthRef_shift ), 1 ), 40 ); +#else + hCPE->hStereoDft->q_hb_nrg_subr = sub( shl( ( *Q_syn + synthRef_shift ), 1 ), 45 + 9 ); +#endif + hCPE->hStereoDft->hb_nrg_fx[0] = hb_nrg_fx; // 2 * (Qx + SynthRef_shift) - 31 + move32(); + hCPE->hStereoDft->td_gain_fx[0] = 0; + move32(); + hCPE->hStereoDft->core_hist[0] = st->core; + move16(); + } + + /*--------------------------------------------------------------------* + * IC-BWE * + * -------------------------------------------------------------------*/ + test(); + test(); + test(); + test(); + IF( st->core != ACELP_CORE || EQ_16( st->extl, -1 ) || ( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && NE_16( hCPE->hCoreCoder[0]->tdm_LRTD_flag, 0 ) ) ) + { + return; + } + ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && LE_32( st->core_brate, SID_2k40 ) ) + { + Copy32( synthRef_fx, synth_fx, output_frame ); + return; + } + + + set16_fx( fb_synth_nonref_fx, 0, L_FRAME48k ); + + /* core switching reset */ + test(); + IF( st->last_core != ACELP_CORE || EQ_16( st->bwidth, (Word16) WB ) ) + { + ic_bwe_dec_reset_fx( hStereoICBWE ); + + IF( st->last_core != ACELP_CORE ) + { + hStereoICBWE->prevSpecMapping_fx = 0; + move16(); + hStereoICBWE->prevgsMapping_fx = 16384; + move16(); + hStereoICBWE->icbweM2Ref_prev_fx = 16384; + move16(); + } + + IF( EQ_16( st->bwidth, WB ) ) + { + /* copy to outputHB and reset hb_synth values */ + Copy32( synthRef_fx, synth_fx, output_frame ); + + IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) + { + hStereoICBWE->prevSpecMapping_fx = 0; + move16(); + hStereoICBWE->prevgsMapping_fx = 16384; + move16(); + hStereoICBWE->icbweM2Ref_prev_fx = 16384; + move16(); + } + ELSE IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) + { + hStereoICBWE->refChanIndx_bwe = L_CH_INDX; + move16(); + hStereoICBWE->prevSpecMapping_fx = 0; + move16(); + + prevgsMapping_fx = hStereoICBWE->prevgsMapping_fx; + move16(); + temp1_fx = shr( extract_h( hStereoDft->side_gain_fx[2 * STEREO_DFT_BAND_MAX + hStereoDft->nbands - 1] ), 1 ); + icbweM2Ref_fx = add( 16384, temp1_fx ); + gsMapping_fx = sub( 16384, temp1_fx ); + + winLen_fx = extract_l( Mpy_32_16_1( st->output_Fs, 41 ) ); //(int16_t)((SHB_OVERLAP_LEN * st->output_Fs) / 16000); + winSlope_fx = div_s( 1, winLen_fx ); + alpha_fx = winSlope_fx; + move16(); + FOR( i = 0; i < winLen_fx; i++ ) + { +#ifndef FIX_826_PRECISION_LOST_AND_COMPL + L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); // Q15 + Q14 + L_tmp = L_mac0( L_tmp, sub( 32767, alpha_fx ), ( hStereoICBWE->icbweM2Ref_prev_fx ) ); // Q15 + Q14; + tmp = shl( round_fx( L_tmp ), 1 ); // Q = 15 + 14 - 16 + 1 = Q14 + synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp ); + move32(); + L_tmp = L_mult0( alpha_fx, gsMapping_fx ); + L_tmp = L_mac0( L_tmp, ( sub( 32767, alpha_fx ) ), ( prevgsMapping_fx ) ); + tmp = shl( round_fx( L_tmp ), 1 ); // Q = 15 + 14 - 16 + 1 = Q14 + synth_fx[i] = Mpy_32_16_1( synth_fx[i], tmp ); + move32(); + IF( LE_16( alpha_fx, sub( 32767, winSlope_fx ) ) ) + { + alpha_fx = add( alpha_fx, winSlope_fx ); + } +#else + /*synthRef[i] *= ( alpha * ( icbweM2Ref ) + ( 1.0f - alpha ) * ( hStereoICBWE->icbweM2Ref_prev ) );*/ + temp1_fx = sub( 32767, alpha_fx ); + L_tmp = L_mult( alpha_fx, icbweM2Ref_fx ); // Q15 + Q14 + 1 + L_tmp = L_mac( L_tmp, temp1_fx, hStereoICBWE->icbweM2Ref_prev_fx ); // Q15 + Q14 +1 ; + synthRef_fx[i] = L_shl( Mpy_32_32( synthRef_fx[i], L_tmp ), 1 ); + move32(); + /*synth[i] *= ( alpha * ( gsMapping ) + ( 1.0f - alpha ) * ( prevgsMapping ) );*/ + L_tmp = L_mult( alpha_fx, gsMapping_fx ); + L_tmp = L_mac( L_tmp, temp1_fx, prevgsMapping_fx ); + synth_fx[i] = L_shl( Mpy_32_32( synth_fx[i], L_tmp ), 1 ); + move32(); + alpha_fx = add_sat( alpha_fx, winSlope_fx ); +#endif + } + FOR( ; i < NS2SA( st->output_Fs, FRAME_SIZE_NS ); i++ ) + { + synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], icbweM2Ref_fx ); + move32(); + synth_fx[i] = Mpy_32_16_1( synth_fx[i], gsMapping_fx ); + move32(); + } + hStereoICBWE->icbweM2Ref_prev_fx = icbweM2Ref_fx; + move16(); + hStereoICBWE->prevgsMapping_fx = gsMapping_fx; + move16(); + + *Q_syn = sub( *Q_syn, 1 ); + } + + return; + } + } + + IF( st->bfi == 0 ) + { + hStereoICBWE->refChanIndx_bwe = get_next_indice_fx( st, STEREO_ICBWE_REFBITS ); + IF( EQ_16( st->flag_ACELP16k, 1 ) ) + { + spIndx = get_next_indice_fx( st, STEREO_ICBWE_SPBITS ); + } + ELSE + { + spIndx = 3; + move16(); + } + IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) + { + gsIndx = get_next_indice_fx( st, STEREO_ICBWE_GSBITS ); + } + ELSE + { + gsIndx = get_next_indice_fx( st, STEREO_ICBWE_GSBITS_DFT ); + } + + /* Store indices in case of frame loss */ + hStereoICBWE->prev_spIndx = spIndx; + move16(); + hStereoICBWE->prev_gsIndx = gsIndx; + move16(); + } + ELSE /*bfi*/ + { + /* Retrieve last decoded indices */ + spIndx = hStereoICBWE->prev_spIndx; + move16(); + gsIndx = hStereoICBWE->prev_gsIndx; + move16(); + hStereoICBWE->refChanIndx_bwe = hStereoICBWE->prev_refChanIndx_bwe; + move16(); + } + + /* IC-BWE parameter de-quant */ + /* sp Mapping */ + hStereoICBWE->prevSpecMapping_fx = usdequant_fx( spIndx, -19661, 3277 ); // Q15 + + /* gs Mapping */ + prevgsMapping_fx = hStereoICBWE->prevgsMapping_fx; // Q14 + move16(); + + IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) + { + hStereoICBWE->prevgsMapping_fx = pow_10_icbwe_gsMapping_tbl_fx[gsIndx]; + move16(); + } + ELSE + { + hStereoICBWE->prevgsMapping_fx = pow_10_icbwe_gsMappingDFT_tbl_fx[gsIndx]; + move16(); + } + + // hStereoICBWE->prevgsMapping = powf( 10, hStereoICBWE->prevgsMapping ); + + specMapping_fx = hStereoICBWE->prevSpecMapping_fx; // Q15 + move16(); + gsMapping_fx = hStereoICBWE->prevgsMapping_fx; // Q14 + move16(); + + test(); + test(); + IF( ( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, FB_TBE ) ) && EQ_16( st->flag_ACELP16k, 1 ) ) + { + Copy( voice_factors_fx, nlMixFac_fx, NB_SUBFR16k ); // Q15 + IF( hCPE->hStereoDftDmx != NULL ) + { + test(); + IF( LT_32( hCPE->hStereoDftDmx->targetGain_fx, 268435456 ) || GT_32( hCPE->hStereoDftDmx->targetGain_fx, 1073741824 ) ) + { + v_multc_fixed_16_16( voice_factors_fx, 16384, nlMixFac_fx, NB_SUBFR16k ); + } + } + ELSE + { + test(); + IF( LT_32( hCPE->hStereoTCA->targetGain_fx, 268435456 ) || GT_32( hCPE->hStereoTCA->targetGain_fx, 1073741824 ) ) + { + v_multc_fixed_16_16( voice_factors_fx, 16384, nlMixFac_fx, NB_SUBFR16k ); + } + } + + // nbSubFr = ( st->flag_ACELP16k == 0 ) ? NB_SUBFR : NB_SUBFR16k; + IF( st->flag_ACELP16k == 0 ) + { + nbSubFr = NB_SUBFR; + move16(); + } + ELSE + { + nbSubFr = NB_SUBFR16k; + move16(); + } + k = 0; + move16(); + FOR( i = 0; i < nbSubFr; i++ ) + { + IF( EQ_16( hCPE->hCoreCoder[0]->coder_type, UNVOICED ) || EQ_16( hStereoICBWE->MSFlag, 1 ) ) + { + temp1_fx = 0; + move16(); + temp2_fx = 32767; + move16(); + } + ELSE + { + tmp = 0; + move16(); + temp1_fx = Sqrt16( nlMixFac_fx[i], &tmp ); + IF( LT_16( tmp, 0 ) ) + { + temp1_fx = shl( temp1_fx, tmp ); + } + tmp = 0; + move16(); + temp2_fx = Sqrt16( sub( 32767, nlMixFac_fx[i] ), &tmp ); + IF( LT_16( tmp, 0 ) ) + { + temp2_fx = shl( temp2_fx, tmp ); + } + } + + FOR( j = 0; j < L_FRAME16k / nbSubFr; j++ ) + { + // common Q for addition + L_nlExc16k = L_deposit_l( hStereoICBWE->nlExc16k_fx[k] ); // prev_q_bwe_exc - 16 + L_mixExc16k = L_deposit_l( hStereoICBWE->mixExc16k_fx[k] ); // Q_exc + L_nlExc16k = L_shl( L_nlExc16k, sub( Q_icBWE, ( sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // Q_icBWE +#ifndef FIX_736_BWE_SECT_C + L_mixExc16k = L_shl( L_mixExc16k, Q_icBWE - st->Q_exc ); // Q_icBWE +#else + L_mixExc16k = L_shl( L_mixExc16k, sub( Q_icBWE, ( sub( st->prev_Q_bwe_exc, 25 ) ) ) ); // Q_icBWE +#endif + excSHB_nonref_fx[k] = L_add( Mpy_32_16_1( L_nlExc16k, temp1_fx ), Mpy_32_16_1( L_mixExc16k, temp2_fx ) ); // Q_icBWE + move32(); + k++; + } + } + + /* LP synthesis */ + Q_syn_shb = 31; + move16(); + + Q_syn_shb = FindScale( hStereoICBWE->mem_syn_shb_nonref_fx, LPC_SHB_ORDER, hStereoICBWE->prev_Q_syn_shb_nonref, Q_syn_shb ); + Q_syn_shb = FindScale( hStereoICBWE->lpSHBRef_fx, LPC_SHB_ORDER + 1, 12, Q_syn_shb ); + Q_syn_shb = FindScale( excSHB_nonref_fx, L_FRAME16k, Q_icBWE, Q_syn_shb ); + Q_syn_shb = FindScale( hStereoICBWE->mem_lpc_shbsynth_nonref_fx, LPC_SHB_ORDER, hStereoICBWE->prev_Q_lpc_shbsynth_nonref, Q_syn_shb ); + + Q_syn_shb = sub( Q_syn_shb, 3 ); // gaurded bits + + Scale_sig32( hStereoICBWE->lpSHBRef_fx, LPC_SHB_ORDER + 1, sub( Q_syn_shb, 12 ) ); + Scale_sig32( excSHB_nonref_fx, L_FRAME16k, sub( Q_syn_shb, Q_icBWE ) ); + Scale_sig32( hStereoICBWE->mem_lpc_shbsynth_nonref_fx, LPC_SHB_ORDER, sub( Q_syn_shb, hStereoICBWE->prev_Q_lpc_shbsynth_nonref ) ); + Scale_sig32( hStereoICBWE->mem_syn_shb_nonref_fx, L_SHB_LAHEAD, sub( Q_syn_shb, hStereoICBWE->prev_Q_syn_shb_nonref ) ); + + + Copy32( hStereoICBWE->mem_syn_shb_nonref_fx, shb_synth_nonref_fx, L_SHB_LAHEAD ); + + E_UTIL_synthesis_fx( 0, hStereoICBWE->lpSHBRef_fx, excSHB_nonref_fx, shb_synth_nonref_fx + L_SHB_LAHEAD, L_FRAME16k, hStereoICBWE->mem_lpc_shbsynth_nonref_fx, 1, LPC_SHB_ORDER ); + + hStereoICBWE->prev_Q_lpc_shbsynth_nonref = Q_syn_shb; + move16(); + + maximum_abs_32_fx( shb_synth_nonref_fx, L_SHB_LAHEAD + 10 + L_SHB_LAHEAD + 10, &maxVal1 ); // Qsyn_shb + + shift_prev_pow = sub( norm_l( maxVal1 ), find_guarded_bits_fx( L_SHB_LAHEAD + 10 ) ); + + prev_pow_fx = 0; + move32(); + curr_pow_fx = 0; + move32(); + FOR( i = 0; i < L_SHB_LAHEAD + 10; i++ ) + { + L_tmp = L_shl( shb_synth_nonref_fx[i], shift_prev_pow ); + prev_pow_fx = L_add( prev_pow_fx, Mpy_32_32( L_tmp, L_tmp ) ); + } + FOR( i = 0; i < L_SHB_LAHEAD + 10; i++ ) + { + L_tmp = L_shl( shb_synth_nonref_fx[L_SHB_LAHEAD + 10 + i], shift_prev_pow ); + curr_pow_fx = L_add( curr_pow_fx, Mpy_32_32( L_tmp, L_tmp ) ); + } + + IF( EQ_32( prev_pow_fx, 0 ) ) + { + e_scale_fx = 0; + move16(); + scale_fx = 0; + move16(); + } + ELSE + { + e_scale_fx = 0; + move16(); + scale_fx = BASOP_Util_Divide3232_Scale( curr_pow_fx, prev_pow_fx, &e_scale_fx ); + scale_fx = Sqrt16( scale_fx, &e_scale_fx ); + } + IF( LT_16( e_scale_fx, 0 ) ) + { + scale_fx = shl( scale_fx, e_scale_fx ); + e_scale_fx = 0; + move16(); + } + FOR( i = 0; i < L_SHB_LAHEAD; i++ ) + { + shb_synth_nonref_fx[i] = Mpy_32_16_1( shb_synth_nonref_fx[i], scale_fx ); + move32(); + } + tmp = 3276; + move16(); + FOR( ; i < L_SHB_LAHEAD + 10; i++ ) + { + IF( EQ_16( e_scale_fx, 0 ) ) + { + temp1_fx = 32767; + move16(); + } + ELSE + { + temp1_fx = shl( 1, sub( 15, e_scale_fx ) ); + move16(); + } + L_tmp = L_mult0( tmp, temp1_fx ); + L_tmp = L_mac0( L_tmp, sub( 32767, tmp ), scale_fx ); + shb_synth_nonref_fx[i] = Mpy_32_16_1( shb_synth_nonref_fx[i], shl( round_fx( L_tmp ), 1 ) ); + move32(); + IF( LT_16( tmp, 29492 ) ) + { + tmp = add( tmp, 3276 ); + } + } + + /* spec and gs adjustment */ + Q_syn_shb = sub( Q_syn_shb, e_scale_fx ); + Scale_sig32( shb_synth_nonref_fx + L_SHB_LAHEAD + 10, L_FRAME16k - 10, -e_scale_fx ); + + tmp = 31; + move16(); + tmp = FindScale( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, Q_syn_shb, tmp ); + temp1_fx = norm_l( hStereoICBWE->memShbSpecMapping_fx ); + IF( EQ_32( hStereoICBWE->memShbSpecMapping_fx, 0 ) ) + { + temp1_fx = 31; + move16(); + } + temp1_fx = add( temp1_fx, hStereoICBWE->prev_Q_memshbspec ); + tmp = s_min( temp1_fx, tmp ); + + tmp = sub( tmp, 9 ); + + Scale_sig32( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, tmp - Q_syn_shb ); + hStereoICBWE->memShbSpecMapping_fx = L_shl( hStereoICBWE->memShbSpecMapping_fx, sub( tmp, hStereoICBWE->prev_Q_memshbspec ) ); + + hStereoICBWE->prev_Q_memshbspec = tmp; + move16(); + Q_syn_shb = tmp; + move16(); + + deemph_fx_32( 0, shb_synth_nonref_fx + L_SHB_LAHEAD, specMapping_fx, L_FRAME16k, &( hStereoICBWE->memShbSpecMapping_fx ) ); + hStereoICBWE->prev_Q_memshbspec = Q_syn_shb; + move16(); + Copy32( shb_synth_nonref_fx + L_FRAME16k, hStereoICBWE->mem_syn_shb_nonref_fx, L_SHB_LAHEAD ); + hStereoICBWE->prev_Q_syn_shb_nonref = Q_syn_shb; + move16(); + + tmp = 31; + move16(); + tmp = FindScale( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, Q_syn_shb, tmp ); + tmp = FindScale( hStereoICBWE->mem_syn_shb_ola_nonref_fx, L_SHB_LAHEAD, hStereoICBWE->prev_Q_syn_shb_ola_nonref, tmp ); + + tmp = sub( tmp, 3 ); + + Scale_sig32( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, tmp - Q_syn_shb ); + Scale_sig32( hStereoICBWE->mem_syn_shb_ola_nonref_fx, L_SHB_LAHEAD, tmp - hStereoICBWE->prev_Q_syn_shb_ola_nonref ); + + ScaleShapedSHB_32( SHB_OVERLAP_LEN, shb_synth_nonref_fx, hStereoICBWE->mem_syn_shb_ola_nonref_fx, hStereoICBWE->gshapeRef_fx, ( Mpy_32_16_1( L_shl( hStereoICBWE->gFrameRef_fx, 1 ), mult_r( gsMapping_fx, 29492 ) ) ), window_shb_fx, subwin_shb_fx, &tmp, &temp1_fx ); + + hStereoICBWE->prev_Q_syn_shb_ola_nonref = tmp; + move16(); + Q_syn_shb = tmp; + move16(); + + IF( EQ_16( st->extl, FB_TBE ) ) + { + v_multc_fixed_16_16( fb_synth_ref_fx, gsMapping_fx, fb_synth_nonref_fx, L_FRAME48k ); + } + + /* generate 32kHz SHB synthesis from 12.8(16)kHz signal */ + + tmp = 31; + move16(); + tmp = FindScale( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, Q_syn_shb, tmp ); + tmp = FindScale( hStereoICBWE->memShbHilbert_nonref_fx, HILBERT_MEM_SIZE, hStereoICBWE->prev_Q_hilb, tmp ); + tmp = FindScale( hStereoICBWE->memShbInterp_nonref_fx, 2 * ALLPASSSECTIONS_STEEP + 1, hStereoICBWE->prev_Q_interp, tmp ); + + tmp = sub( tmp, 3 ); + + Scale_sig32( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, sub( tmp, Q_syn_shb ) ); + Scale_sig32( hStereoICBWE->memShbHilbert_nonref_fx, HILBERT_MEM_SIZE, sub( tmp, hStereoICBWE->prev_Q_hilb ) ); + Scale_sig32( hStereoICBWE->memShbInterp_nonref_fx, 2 * ALLPASSSECTIONS_STEEP + 1, sub( tmp, hStereoICBWE->prev_Q_interp ) ); + + hStereoICBWE->prev_Q_hilb = tmp; + move16(); + hStereoICBWE->prev_Q_interp = tmp; + move16(); + + Q_syn_shb = tmp; + move16(); + + GenSHBSynth_fx_32( shb_synth_nonref_fx, error_fx, hStereoICBWE->memShbHilbert_nonref_fx, hStereoICBWE->memShbInterp_nonref_fx, st->L_frame, &( hStereoICBWE->syn_dm_phase_nonref ) ); + } + ELSE + { + Copy32( synthRef_fx, synth_fx, output_frame ); + + winLen_fx = extract_l( Mpy_32_16_1( st->output_Fs, 41 ) ); + winSlope_fx = div_s( 1, winLen_fx ); + alpha_fx = winSlope_fx; + move16(); + + + IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) + { + ratio_L_fx = 16384; + move16(); + } + ELSE + { + ratio_L_fx = extract_h( tdm_ratio_tabl_fx[hCPE->hStereoTD->tdm_last_ratio_idx] ); + move16(); + } + + icbweM2Ref_fx = gsMapping_fx; + move16(); + IF( hStereoICBWE->refChanIndx_bwe == L_CH_INDX ) + { + + IF( GE_16( ratio_L_fx, 3276 ) ) + { + tmp = mult_r( sub( 32767, ratio_L_fx ), sub( 32767, ratio_L_fx ) ); // Q15 + tmp = mult_r( tmp, gsMapping_fx ); // Q14 + tmp = mult_r( tmp, gsMapping_fx ); // Q13 + IF( LT_16( tmp, 4096 ) ) + { + temp1_fx = 0; + move16(); + temp2_fx = 0; + move16(); + tmp = shl( tmp, 2 ); + icbweM2Ref_fx = Sqrt16( sub( 16384, tmp ), &temp1_fx ); + icbweM2Ref_fx = BASOP_Util_Divide1616_Scale( icbweM2Ref_fx, ratio_L_fx, &temp2_fx ); + icbweM2Ref_fx = shl( icbweM2Ref_fx, add( temp2_fx, sub( temp1_fx, 1 ) ) ); // Q14 + } + ELSE + { + icbweM2Ref_fx = 0; + move16(); + } + } + } + ELSE + { + IF( LE_16( ratio_L_fx, 29490 ) ) + { +#ifdef FIX_TMP_714 + tmp = mult_r( ratio_L_fx, ratio_L_fx ); // Q15 +#else + tmp = mult_r( sub( 32767, ratio_L_fx ), sub( 32767, ratio_L_fx ) ); // Q15 +#endif + tmp = mult_r( tmp, gsMapping_fx ); // Q14 + tmp = mult_r( tmp, gsMapping_fx ); // Q13 + IF( LT_16( tmp, 4096 ) ) + { + temp1_fx = 0; + move16(); + temp2_fx = 0; + move16(); + tmp = shl( tmp, 2 ); + icbweM2Ref_fx = Sqrt16( sub( 16384, tmp ), &temp1_fx ); + icbweM2Ref_fx = BASOP_Util_Divide1616_Scale( icbweM2Ref_fx, sub( 32767, ratio_L_fx ), &temp2_fx ); + icbweM2Ref_fx = shl( icbweM2Ref_fx, add( temp2_fx, sub( temp1_fx, 1 ) ) ); // Q14 + } + ELSE + { + icbweM2Ref_fx = 0; + move16(); + } + } + } + + icbweM2Ref_fx = s_max( gsMapping_fx, icbweM2Ref_fx ); + + FOR( i = 0; i < winLen_fx; i++ ) + { + L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); + L_tmp = L_mac0( L_tmp, sub( 32767, alpha_fx ), hStereoICBWE->icbweM2Ref_prev_fx ); + tmp = shl( round_fx( L_tmp ), 1 ); + synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp ); + move32(); + L_tmp = L_mult0( alpha_fx, gsMapping_fx ); + L_tmp = L_mac0( L_tmp, sub( 32767, alpha_fx ), prevgsMapping_fx ); + tmp = shl( round_fx( L_tmp ), 1 ); + synth_fx[i] = Mpy_32_16_1( synth_fx[i], tmp ); + move32(); + IF( LE_16( alpha_fx, sub( 32767, winSlope_fx ) ) ) + { + alpha_fx = add( alpha_fx, winSlope_fx ); + } + } + FOR( ; i < NS2SA( st->output_Fs, FRAME_SIZE_NS ); i++ ) + { + synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], icbweM2Ref_fx ); + move32(); + synth_fx[i] = Mpy_32_16_1( synth_fx[i], gsMapping_fx ); + move32(); + } + hStereoICBWE->icbweM2Ref_prev_fx = icbweM2Ref_fx; + move16(); + + ic_bwe_dec_reset_fx( hStereoICBWE ); + hStereoICBWE->prevSpecMapping_fx = 0; + move16(); + + *Q_syn = sub( *Q_syn, 1 ); + + return; + } + + /* resample to output FS */ + + + IF( EQ_32( st->output_Fs, 48000 ) ) + { + tmp = 31; + move16(); + tmp = FindScale( error_fx, L_FRAME32k, Q_syn_shb, tmp ); + tmp = FindScale( hStereoICBWE->memShb_fsout_nonref_fx, INTERP_3_2_MEM_LEN, hStereoICBWE->prev_Q_fsout, tmp ); + tmp = sub( tmp, 4 ); + + Scale_sig32( error_fx, L_FRAME32k, sub( tmp, Q_syn_shb ) ); + Scale_sig32( hStereoICBWE->memShb_fsout_nonref_fx, INTERP_3_2_MEM_LEN, sub( tmp, hStereoICBWE->prev_Q_fsout ) ); + interpolate_3_over_2_allpass_32( error_fx, L_FRAME32k, synth_fx, hStereoICBWE->memShb_fsout_nonref_fx ); + hStereoICBWE->prev_Q_fsout = tmp; + move16(); + } + ELSE IF( EQ_32( st->output_Fs, 32000 ) ) + { + Copy32( error_fx, synth_fx, L_FRAME32k ); + } + ELSE IF( EQ_32( st->output_Fs, 16000 ) ) + { + tmp = 31; + move16(); + tmp = FindScale( error_fx, L_FRAME32k, Q_syn_shb, tmp ); + tmp = FindScale( hStereoICBWE->memShb_fsout_nonref_fx, INTERP_3_2_MEM_LEN, hStereoICBWE->prev_Q_fsout, tmp ); + tmp = sub( tmp, 4 ); + + Scale_sig32( error_fx, L_FRAME32k, sub( tmp, Q_syn_shb ) ); + Scale_sig32( hStereoICBWE->memShb_fsout_nonref_fx, INTERP_3_2_MEM_LEN, sub( tmp, hStereoICBWE->prev_Q_fsout ) ); + Decimate_allpass_steep_fx32( error_fx, hStereoICBWE->memShb_fsout_nonref_fx, L_FRAME32k, synth_fx ); + hStereoICBWE->prev_Q_fsout = tmp; + move16(); + } +#ifndef MSAN_FIX + Scale_sig32( synth_fx, L_FRAME48k, sub( *Q_syn, add( 1, tmp ) ) ); +#else + Scale_sig32( synth_fx, output_frame, sub( *Q_syn, add( 1, tmp ) ) ); +#endif + + *Q_syn = sub( *Q_syn, 1 ); + + test(); + IF( EQ_16( st->extl, FB_TBE ) && EQ_32( st->output_Fs, 48000 ) ) + { + + // v_add( fb_synth_nonref_fx, synth_fx, synth_fx, L_FRAME48k, 0 ); + FOR( i = 0; i < L_FRAME48k; i++ ) + { + synth_fx[i] = L_add( synth_fx[i], L_deposit_l( fb_synth_nonref_fx[i] ) ); + move32(); + } + } + + /* copy to outputHB and reset hb_synth values */ + + IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) + { + ratio_L_fx = 16384; + move16(); + } + ELSE + { + ratio_L_fx = extract_h( tdm_ratio_tabl_fx[hCPE->hStereoTD->tdm_last_ratio_idx] ); + move16(); + } + + icbweM2Ref_fx = gsMapping_fx; + move16(); + IF( hStereoICBWE->refChanIndx_bwe == L_CH_INDX ) + { + IF( GE_16( ratio_L_fx, 3276 ) ) + { + tmp = mult_r( sub( 32767, ratio_L_fx ), sub( 32767, ratio_L_fx ) ); // Q15 + tmp = mult_r( tmp, gsMapping_fx ); // Q14 + tmp = mult_r( tmp, gsMapping_fx ); // Q13 + IF( LT_16( tmp, 4096 ) ) + { + temp1_fx = 0; + move16(); + temp2_fx = 0; + move16(); + tmp = shl( tmp, 2 ); + icbweM2Ref_fx = Sqrt16( sub( 16384, tmp ), &temp1_fx ); + icbweM2Ref_fx = BASOP_Util_Divide1616_Scale( icbweM2Ref_fx, ratio_L_fx, &temp2_fx ); + icbweM2Ref_fx = shl( icbweM2Ref_fx, add( temp1_fx, sub( temp2_fx, 1 ) ) ); // Q14 + } + ELSE + { + icbweM2Ref_fx = 0; + move16(); + } + } + } + ELSE + { + IF( LE_16( ratio_L_fx, 29490 ) ) + { +#ifdef FIX_TMP_714 + tmp = mult_r( ratio_L_fx, ratio_L_fx ); // Q15 +#else + tmp = mult_r( sub( 32767, ratio_L_fx ), sub( 32767, ratio_L_fx ) ); // Q15 +#endif + tmp = mult_r( tmp, gsMapping_fx ); // Q14 + tmp = mult_r( tmp, gsMapping_fx ); // Q13 + IF( LT_16( tmp, 4096 ) ) + { + temp1_fx = 0; + move16(); + temp2_fx = 0; + move16(); + tmp = shl( tmp, 2 ); + icbweM2Ref_fx = Sqrt16( sub( 16384, tmp ), &temp1_fx ); + icbweM2Ref_fx = BASOP_Util_Divide1616_Scale( icbweM2Ref_fx, sub( 32767, ratio_L_fx ), &temp2_fx ); + icbweM2Ref_fx = shl( icbweM2Ref_fx, add( temp2_fx, sub( temp1_fx, 1 ) ) ); // Q14 + } + ELSE + { + icbweM2Ref_fx = 0; + move16(); + } + } + } + + icbweM2Ref_fx = s_max( gsMapping_fx, icbweM2Ref_fx ); + + winLen_fx = extract_l( Mpy_32_16_1( st->output_Fs, 41 ) ); + winSlope_fx = div_s( 1, winLen_fx ); + alpha_fx = winSlope_fx; + move16(); + FOR( i = 0; i < winLen_fx; i++ ) + { + L_tmp = L_mult0( alpha_fx, icbweM2Ref_fx ); + L_tmp = L_mac0( L_tmp, sub( 32767, alpha_fx ), hStereoICBWE->icbweM2Ref_prev_fx ); + tmp = shl( round_fx( L_tmp ), 1 ); + synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], tmp ); + move32(); + IF( LE_16( alpha_fx, sub( 32767, winSlope_fx ) ) ) + { + alpha_fx = add( alpha_fx, winSlope_fx ); + } + } + + FOR( ; i < NS2SA( st->output_Fs, FRAME_SIZE_NS ); i++ ) + { + synthRef_fx[i] = Mpy_32_16_1( synthRef_fx[i], icbweM2Ref_fx ); + move32(); + } + + hStereoICBWE->icbweM2Ref_prev_fx = icbweM2Ref_fx; + move16(); + + return; +} +#endif + +/*-------------------------------------------------------------------* + * stereo_icBWE_decproc() + * + * Stereo (inter-channel) BWE mapping - decoder initialization + *-------------------------------------------------------------------*/ + +#ifndef IVAS_FLOAT_FIXED +void stereo_icBWE_decproc( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + float *output[CPE_CHANNELS], /* i/o: output synthesis */ + float outputHB[CPE_CHANNELS][L_FRAME48k], /* i : HB synthesis */ + const int16_t last_core, /* i : last core, primary channel */ + const int16_t last_bwidth, /* i : last bandwidth */ + const int16_t output_frame /* i : frame length */ +) +{ + int16_t i, j, n, decoderDelay, icbweOLASize, dftOvlLen; + int16_t core, memOffset, refChanIndx_bwe; + float temp0[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )], temp1[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )]; + float winSlope, alpha; + const float *win_dft; + int32_t extl_brate, output_Fs; + + STEREO_ICBWE_DEC_HANDLE hStereoICBWE = hCPE->hStereoICBWE; + + + /*--------------------------------------------------------------------* + * skip IC-BWE in case of SID or NO_DATA frame + * -------------------------------------------------------------------*/ + + if ( ( hCPE->element_mode == IVAS_CPE_TD || hCPE->element_mode == IVAS_CPE_DFT ) && hCPE->nchan_out == 2 /*&& hCPE->hCoreCoder[0]->core_brate > SID_2k40*/ && hCPE->hCoreCoder[0]->last_core_brate <= SID_2k40 ) + { + stereo_icBWE_init_dec( hCPE->hStereoICBWE ); + } + + if ( hCPE->hCoreCoder[0]->core_brate <= SID_2k40 ) + { + return; + } + + /*--------------------------------------------------------------------* + * skip IC-BWE in case of mono DMX output * + * -------------------------------------------------------------------*/ + + if ( hCPE->nchan_out == 1 && hCPE->element_mode == IVAS_CPE_DFT ) + { + add_HB_to_mono_dmx( hCPE, output[0], outputHB[0], last_core, output_frame ); + + return; + } + else if ( hCPE->nchan_out == 1 && hCPE->element_mode != IVAS_CPE_TD ) + { + return; + } + + /*--------------------------------------------------------------------* + * IC-BWE processing + * -------------------------------------------------------------------*/ + + core = hCPE->hCoreCoder[0]->core; + extl_brate = hCPE->hCoreCoder[0]->extl_brate; + output_Fs = hCPE->hCoreCoder[0]->output_Fs; + + memOffset = NS2SA( output_Fs, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); + + /* LRTD stereo mode - 2xBWEs used */ + if ( hCPE->element_mode == IVAS_CPE_TD && hCPE->hCoreCoder[0]->tdm_LRTD_flag ) + { + /* delay HB synth */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + mvr2r( outputHB[n] + output_frame - memOffset, temp0, memOffset ); + mvr2r( outputHB[n], outputHB[n] + memOffset, output_frame - memOffset ); + mvr2r( hCPE->prev_hb_synth[n], outputHB[n], memOffset ); + mvr2r( temp0, hCPE->prev_hb_synth[n], memOffset ); + } + + if ( hCPE->nchan_out == 1 ) + { + /* stereo to mono downmix */ + for ( i = 0; i < output_frame; i++ ) + { + outputHB[0][i] = ( outputHB[0][i] + outputHB[1][i] ) * 0.5f; + } + v_add( output[0], outputHB[0], output[0], output_frame ); + } + else + { + /* Add the delayed hb_synth component to the delayed ACELP synthesis */ + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + v_add( output[n], outputHB[n], output[n], output_frame ); + } + } + } + else + { + for ( n = 0; n < CPE_CHANNELS; n++ ) + { + set_f( hCPE->prev_hb_synth[n], 0, memOffset ); + } + } + + if ( hCPE->element_mode != IVAS_CPE_MDCT && !( hCPE->element_mode == IVAS_CPE_TD && hCPE->hCoreCoder[0]->tdm_LRTD_flag ) ) + { + if ( hCPE->last_element_mode == IVAS_CPE_MDCT ) + { + set_f( hStereoICBWE->memOutHB[0], 0, memOffset ); + set_f( hStereoICBWE->memOutHB[1], 0, memOffset ); + + set_f( hStereoICBWE->memTransitionHB[0], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + set_f( hStereoICBWE->memTransitionHB[1], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + } + + if ( core == ACELP_CORE && extl_brate > 0 ) + { + refChanIndx_bwe = hStereoICBWE->refChanIndx_bwe; + + if ( hCPE->element_mode == IVAS_CPE_DFT && hCPE->hCoreCoder[0]->bwidth > WB && last_bwidth == WB && hCPE->hCoreCoder[0]->ini_frame > 1 /* counter wass already updated */ ) + { + /* fad-in reference HB signal */ + winSlope = ( memOffset > 0 ) ? ( 1.0f / memOffset ) : 0; + for ( i = 0; i < memOffset; i++ ) + { + outputHB[refChanIndx_bwe][i] *= ( i + 1 ) * winSlope; + } + } + /* Resampled LB and HB offset */ + mvr2r( outputHB[refChanIndx_bwe], temp0 + memOffset, output_frame - memOffset ); + mvr2r( outputHB[!refChanIndx_bwe], temp1 + memOffset, output_frame - memOffset ); + + decoderDelay = NS2SA( output_Fs, IVAS_DEC_DELAY_NS ); + + if ( last_core != ACELP_CORE && hCPE->element_mode == IVAS_CPE_DFT ) + { + /* hb_synth of mid band is faded out in the 1.25 ms prior to DFT analysis and the icbwe is faded in time domain */ + icbweOLASize = NS2SA( output_Fs, STEREO_DFT_DELAY_DEC_BWE_NS ); + + for ( i = 0; i < decoderDelay; i++ ) + { + temp0[i] = 0; + temp1[i] = 0; + } + + assert( icbweOLASize > 0 ); + winSlope = 1.0f / icbweOLASize; + alpha = winSlope; + for ( ; i < decoderDelay + icbweOLASize; i++ ) + { + temp0[i] *= alpha; + temp1[i] *= alpha; + alpha += winSlope; + } + } + else + { + if ( refChanIndx_bwe != hStereoICBWE->prev_refChanIndx_bwe ) + { + winSlope = ( memOffset > 0 ) ? ( 1.0f / memOffset ) : 0; + for ( i = 0; i < memOffset; i++ ) + { + temp0[i] = ( ( i + 1 ) * winSlope ) * hStereoICBWE->memOutHB[refChanIndx_bwe][i] + + ( 1 - ( i + 1 ) * winSlope ) * hStereoICBWE->memOutHB[hStereoICBWE->prev_refChanIndx_bwe][i]; + temp1[i] = ( ( i + 1 ) * winSlope ) * hStereoICBWE->memOutHB[hStereoICBWE->prev_refChanIndx_bwe][i] + + ( 1 - ( i + 1 ) * winSlope ) * hStereoICBWE->memOutHB[refChanIndx_bwe][i]; + } + } + else + { + mvr2r( hStereoICBWE->memOutHB[refChanIndx_bwe], temp0, memOffset ); + mvr2r( hStereoICBWE->memOutHB[!refChanIndx_bwe], temp1, memOffset ); + } + } + + if ( hCPE->nchan_out == 1 ) + { + /* stereo to mono downmix */ + for ( i = 0; i < output_frame; i++ ) + { + temp0[i] = ( temp0[i] + temp1[i] ) * 0.5f; + output[0][i] += temp0[i]; + } + } + else + { + + v_add( temp0, output[0], output[0], output_frame ); + v_add( temp1, output[1], output[1], output_frame ); + } + mvr2r( outputHB[0] + output_frame - memOffset, hStereoICBWE->memOutHB[0], memOffset ); + mvr2r( outputHB[1] + output_frame - memOffset, hStereoICBWE->memOutHB[1], memOffset ); + + if ( hCPE->element_mode == IVAS_CPE_DFT ) + { + win_dft = hCPE->hStereoDft->win32ms; + dftOvlLen = hCPE->hStereoDft->dft32ms_ovl; + + /* Preparing buffers in anticipation of an ACELP to TCX switch */ + j = 0; + for ( i = 0; i < memOffset; i++ ) + { + hStereoICBWE->memTransitionHB[0][i] = hStereoICBWE->memOutHB[0][i] * win_dft[STEREO_DFT32MS_STEP * ( dftOvlLen - 1 - j )]; + hStereoICBWE->memTransitionHB[1][i] = hStereoICBWE->memOutHB[1][i] * win_dft[STEREO_DFT32MS_STEP * ( dftOvlLen - 1 - j )]; + j++; + } + + for ( i = 0; j < dftOvlLen; i++ ) + { + hStereoICBWE->memTransitionHB[0][memOffset + i] = outputHB[0][output_frame - i - 1] * win_dft[STEREO_DFT32MS_STEP * ( dftOvlLen - 1 - j )]; + hStereoICBWE->memTransitionHB[1][memOffset + i] = outputHB[1][output_frame - i - 1] * win_dft[STEREO_DFT32MS_STEP * ( dftOvlLen - 1 - j )]; + j++; + } + } + + hStereoICBWE->prev_refChanIndx_bwe = refChanIndx_bwe; + } + else + { + if ( last_core == ACELP_CORE ) + { + if ( hCPE->element_mode == IVAS_CPE_TD ) + { + v_add( output[0], hStereoICBWE->memOutHB[hStereoICBWE->prev_refChanIndx_bwe], output[0], memOffset ); + v_add( output[1], hStereoICBWE->memOutHB[!hStereoICBWE->prev_refChanIndx_bwe], output[1], memOffset ); + } + else + { + /* This is generated in the ACELP frame and windowed. This process is akin to GenTransition for IC-BWE */ + v_add( output[0], hStereoICBWE->memTransitionHB[hStereoICBWE->prev_refChanIndx_bwe], output[0], NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + v_add( output[1], hStereoICBWE->memTransitionHB[!hStereoICBWE->prev_refChanIndx_bwe], output[1], NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + } + + set_f( hStereoICBWE->memOutHB[0], 0, memOffset ); + set_f( hStereoICBWE->memOutHB[1], 0, memOffset ); + + set_f( hStereoICBWE->memTransitionHB[0], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + set_f( hStereoICBWE->memTransitionHB[1], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + } + } + } + else if ( hCPE->element_mode == IVAS_CPE_TD && hCPE->hCoreCoder[0]->tdm_LRTD_flag && hStereoICBWE != NULL ) + { + stereo_icBWE_init_dec( hCPE->hStereoICBWE ); + } + else if ( hCPE->element_mode == IVAS_CPE_MDCT && hCPE->last_element_mode == IVAS_CPE_DFT && last_core == ACELP_CORE ) + { + int16_t delay_tdbwe = NS2SA( output_Fs, DELAY_BWE_TOTAL_NS ); + + for ( n = 0; n < hCPE->nchan_out; n++ ) + { + for ( i = 0; i < delay_tdbwe; i++ ) + { + output[n][NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) - delay_tdbwe + i] += outputHB[0][i]; + } + } + /* reset BWE structs as they are only needed in the transition frame in MDCT Stereo */ + td_bwe_dec_init( hCPE->hCoreCoder[0]->hBWE_TD, -1, output_Fs ); + + fd_bwe_dec_init_flt( hCPE->hCoreCoder[0]->hBWE_FD ); + } + + if ( hCPE->element_mode == IVAS_CPE_DFT && ( max( hCPE->hStereoDft->td_gain[0], hCPE->hStereoDft->td_gain[1] ) > 0 ) ) + { + float win_in, win_out, tmp; + + win_dft = hCPE->hStereoDft->win32ms; + dftOvlLen = hCPE->hStereoDft->dft32ms_ovl; + + for ( i = 0; i < dftOvlLen; i++ ) + { + win_in = win_dft[STEREO_DFT32MS_STEP * i] * win_dft[STEREO_DFT32MS_STEP * i]; + win_out = 1 - win_in; + tmp = ( win_in * hCPE->hStereoDft->td_gain[0] + win_out * hCPE->hStereoDft->td_gain[1] ) * hCPE->hStereoDft->hb_stefi_sig[i]; + + output[0][i] += tmp; + output[1][i] -= tmp; + } + for ( i = dftOvlLen; i < output_frame; i++ ) + { + tmp = hCPE->hStereoDft->td_gain[0] * hCPE->hStereoDft->hb_stefi_sig[i]; + output[0][i] += tmp; + output[1][i] -= tmp; + } + } + + return; +} +#else +void stereo_icBWE_decproc_fx( + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word32 *output[CPE_CHANNELS], /* i/o: output synthesis */ + Word32 outputHB[CPE_CHANNELS][L_FRAME48k], /* i : HB synthesis */ + const Word16 last_core, /* i : last core, primary channel */ + const Word16 last_bwidth, /* i : last bandwidth */ + const Word16 output_frame /* i : frame length */ +#ifndef FIX_826_PRECISION_LOST_AND_COMPL + , + Word16 q_output /* i : Q-fac of output */ +#endif +) +{ + Word16 i, j, n, decoderDelay, icbweOLASize, dftOvlLen; + Word16 core, memOffset, refChanIndx_bwe; + + Word32 temp0_fx[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )], temp1_fx[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )]; +#if defined FIX_826_PRECISION_LOST_AND_COMPL + Word16 winSlope_fx = 0, alpha_fx; +#else + Word32 winSlope_fx = 0, alpha_fx; +#endif + move32(); + const Word16 *win_dft_fx; + Word32 extl_brate, output_Fs; + + STEREO_ICBWE_DEC_HANDLE hStereoICBWE = hCPE->hStereoICBWE; + + /*--------------------------------------------------------------------* + * skip IC-BWE in case of SID or NO_DATA frame + * -------------------------------------------------------------------*/ + + test(); + test(); + test(); + IF( ( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) || EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) && EQ_16( hCPE->nchan_out, 2 ) /*&& hCPE->hCoreCoder[0]->core_brate > SID_2k40*/ && LE_32( hCPE->hCoreCoder[0]->last_core_brate, SID_2k40 ) ) + { + stereo_icBWE_init_dec_fx( hCPE->hStereoICBWE ); + } + + IF( LE_32( hCPE->hCoreCoder[0]->core_brate, SID_2k40 ) ) + { + return; + } + + /*--------------------------------------------------------------------* + * skip IC-BWE in case of mono DMX output * + * -------------------------------------------------------------------*/ + + test(); + test(); + IF( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) + { + add_HB_to_mono_dmx_fx( hCPE, output[0], outputHB[0], last_core, output_frame ); + return; + } + ELSE IF( EQ_16( hCPE->nchan_out, 1 ) && NE_16( hCPE->element_mode, IVAS_CPE_TD ) ) + { + return; + } + + /*--------------------------------------------------------------------* + * IC-BWE processing + * -------------------------------------------------------------------*/ + + core = hCPE->hCoreCoder[0]->core; + move16(); + extl_brate = hCPE->hCoreCoder[0]->extl_brate; + move32(); + output_Fs = hCPE->hCoreCoder[0]->output_Fs; + move32(); + + memOffset = NS2SA( output_Fs, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); + + /* LRTD stereo mode - 2xBWEs used */ + test(); + IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && hCPE->hCoreCoder[0]->tdm_LRTD_flag ) + { + /* delay HB synth */ + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + Copy32( outputHB[n] + output_frame - memOffset, temp0_fx, memOffset ); + Copy32( outputHB[n], outputHB[n] + memOffset, output_frame - memOffset ); + Copy32( hCPE->prev_hb_synth_fx[n], outputHB[n], memOffset ); + Copy32( temp0_fx, hCPE->prev_hb_synth_fx[n], memOffset ); + } + + IF( EQ_16( hCPE->nchan_out, 1 ) ) + { + /* stereo to mono downmix */ + FOR( i = 0; i < output_frame; i++ ) + { +#ifdef FIX_826_PRECISION_LOST_AND_COMPL + outputHB[0][i] = W_extract_h( W_mac_32_16( W_mult_32_16( outputHB[0][i], 16384 ), outputHB[1][i], 16384 ) ); +#else + outputHB[0][i] = L_shr( ( outputHB[0][i] + outputHB[1][i] ), 1 ); +#endif + move32(); + } + v_add_32( output[0], outputHB[0], output[0], output_frame ); + } + ELSE + { + /* Add the delayed hb_synth component to the delayed ACELP synthesis */ + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + v_add_32( output[n], outputHB[n], output[n], output_frame ); + } + } + } + ELSE + { + FOR( n = 0; n < CPE_CHANNELS; n++ ) + { + set32_fx( hCPE->prev_hb_synth_fx[n], 0, memOffset ); + } + } + + test(); + test(); + test(); + test(); + test(); + test(); + IF( NE_16( hCPE->element_mode, IVAS_CPE_MDCT ) && !( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && hCPE->hCoreCoder[0]->tdm_LRTD_flag ) ) + { + IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) ) + { + set32_fx( hStereoICBWE->memOutHB_fx[0], 0, memOffset ); + set32_fx( hStereoICBWE->memOutHB_fx[1], 0, memOffset ); + + set32_fx( hStereoICBWE->memTransitionHB_fx[0], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + set32_fx( hStereoICBWE->memTransitionHB_fx[1], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + } + + test(); + IF( EQ_16( core, ACELP_CORE ) && extl_brate > 0 ) + { + refChanIndx_bwe = hStereoICBWE->refChanIndx_bwe; + move16(); + + test(); + test(); + test(); + IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && GT_16( hCPE->hCoreCoder[0]->bwidth, WB ) && EQ_16( last_bwidth, WB ) && GT_16( hCPE->hCoreCoder[0]->ini_frame, 1 ) /* counter wass already updated */ ) + { + /* fad-in reference HB signal */ + IF( GT_16( memOffset, 0 ) ) + { + SWITCH( memOffset ) + { +#if defined FIX_826_PRECISION_LOST_AND_COMPL + case 15: + winSlope_fx = 2185; + move32(); + BREAK; + case 30: + winSlope_fx = 1092; + move32(); + BREAK; + case 45: + winSlope_fx = 728; + move32(); + BREAK; +#else + case 15: + winSlope_fx = 71582792; + move32(); + BREAK; + case 30: + winSlope_fx = 35791396; + move32(); + BREAK; + case 45: + winSlope_fx = 23860930; + move32(); + BREAK; +#endif + } + // memOffset for 16K 32K 48K are 15 30 45 respectively.camera + } + ELSE + { + winSlope_fx = 0; + move32(); + } +#if defined FIX_826_PRECISION_LOST_AND_COMPL + alpha_fx = 0; + move16(); +#endif + FOR( i = 0; i < memOffset; i++ ) + { +#if defined FIX_826_PRECISION_LOST_AND_COMPL + alpha_fx = add_sat( alpha_fx, winSlope_fx ); + outputHB[refChanIndx_bwe][i] = W_round48_L( W_mult_32_16( outputHB[refChanIndx_bwe][i] /* Q11 + Q15 + 1 - 16 = Q11)*/, winSlope_fx ) ); // +#else + Word32 mul_win = Mpy_32_16_1( winSlope_fx, ( i + 1 ) ); // Q30 + Q0 - 15 = Q15 + mul_win = L_shl( mul_win, 15 ); // Q30 + outputHB[refChanIndx_bwe][i] = L_shl( Mpy_32_32( outputHB[refChanIndx_bwe][i] /* Q11 + Q30 - 31 = Q10)*/, mul_win ), 1 ); // +#endif + move32(); + } + } + /* Resampled LB and HB offset */ + Copy32( outputHB[refChanIndx_bwe], temp0_fx + memOffset, sub( output_frame, memOffset ) ); + Copy32( outputHB[!refChanIndx_bwe], temp1_fx + memOffset, sub( output_frame, memOffset ) ); + + decoderDelay = NS2SA( output_Fs, IVAS_DEC_DELAY_NS ); + + test(); + IF( last_core != ACELP_CORE && EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) + { + /* hb_synth of mid band is faded out in the 1.25 ms prior to DFT analysis and the icbwe is faded in time domain */ + icbweOLASize = NS2SA( output_Fs, STEREO_DFT_DELAY_DEC_BWE_NS ); + + FOR( i = 0; i < decoderDelay; i++ ) + { + temp0_fx[i] = 0; + move32(); + temp1_fx[i] = 0; + move32(); + } + + assert( icbweOLASize > 0 ); + SWITCH( icbweOLASize ) + { +#if defined FIX_826_PRECISION_LOST_AND_COMPL + case 60: + winSlope_fx = 546; + move16(); + BREAK; + case 40: + winSlope_fx = 819; + move16(); + BREAK; + case 20: + winSlope_fx = 1638; + move16(); + BREAK; + default: + fprintf( stderr, "icbweOLASize of size %d not implemented \n", icbweOLASize ); + assert( 0 ); + BREAK; +#else + case 60: + winSlope_fx = 17895698; + move32(); + BREAK; + case 40: + winSlope_fx = 26843546; + move32(); + BREAK; + case 20: + winSlope_fx = 53687092; + move32(); + BREAK; +#endif + } + alpha_fx = winSlope_fx; // Q30 + move32(); + FOR( ; i < add( decoderDelay, icbweOLASize ); i++ ) + { +#if defined FIX_826_PRECISION_LOST_AND_COMPL + temp0_fx[i] = W_round48_L( W_mult_32_16( temp0_fx[i], alpha_fx ) ); // Q11 + move32(); + temp1_fx[i] = W_round48_L( W_mult_32_16( temp1_fx[i], alpha_fx ) ); + move32(); + alpha_fx = add_sat( alpha_fx, winSlope_fx ); +#else + temp0_fx[i] = L_shl_sat( Mpy_32_32( temp0_fx[i], alpha_fx ), 1 ); // Q11 + move32(); + temp1_fx[i] = L_shl_sat( Mpy_32_32( temp1_fx[i], alpha_fx ), 1 ); + move32(); + alpha_fx = L_add( alpha_fx, winSlope_fx ); +#endif + } + } + ELSE + { + IF( NE_16( refChanIndx_bwe, hStereoICBWE->prev_refChanIndx_bwe ) ) + { + IF( memOffset > 0 ) + { + SWITCH( memOffset ) + { +#if defined FIX_826_PRECISION_LOST_AND_COMPL + case 15: + winSlope_fx = 2185; + move16(); + BREAK; + case 30: + winSlope_fx = 1092; + move16(); + BREAK; + case 45: + winSlope_fx = 728; + move16(); + BREAK; +#else + case 15: + winSlope_fx = 71582792; + move32(); + BREAK; + case 30: + winSlope_fx = 35791396; + move32(); + BREAK; + case 45: + winSlope_fx = 23860930; // Q30 + move32(); + BREAK; +#endif + } + // memOffset for 16K 32K 48K are 15 30 45 respectively.camera + } + ELSE + { + winSlope_fx = 0; + move32(); + } +#if defined FIX_826_PRECISION_LOST_AND_COMPL + Word16 Incr = 0; + Word16 Decr = MAX_16; +#endif + move16(); + move16(); + FOR( i = 0; i < memOffset; i++ ) + { +#ifndef FIX_826_PRECISION_LOST_AND_COMPL + temp0_fx[i] = L_add( L_shl( Mpy_32_32( Mpy_32_16_1( winSlope_fx, ( i + 1 ) ), hStereoICBWE->memOutHB_fx[refChanIndx_bwe][i] ), 16 ), + L_shl( Mpy_32_32( Mpy_32_16_1( winSlope_fx, 1 - ( i + 1 ) ), hStereoICBWE->memOutHB_fx[hStereoICBWE->prev_refChanIndx_bwe][i] ), 16 ) ); + move32(); + + temp1_fx[i] = L_add( L_shl( Mpy_32_32( Mpy_32_16_1( winSlope_fx, ( i + 1 ) ), hStereoICBWE->memOutHB_fx[hStereoICBWE->prev_refChanIndx_bwe][i] ), 16 ), + L_shl( Mpy_32_32( Mpy_32_16_1( winSlope_fx, ( 1 - ( i + 1 ) ) ), hStereoICBWE->memOutHB_fx[refChanIndx_bwe][i] ), 16 ) ); +#else + Incr = add_sat( Incr, winSlope_fx ); + Decr = sub( Decr, winSlope_fx ); + temp0_fx[i] = W_round48_L( W_mac_32_16( W_mult_32_16( hStereoICBWE->memOutHB_fx[refChanIndx_bwe][i], Incr ), hStereoICBWE->memOutHB_fx[hStereoICBWE->prev_refChanIndx_bwe][i], Decr ) ); + temp1_fx[i] = W_round48_L( W_mac_32_16( W_mult_32_16( hStereoICBWE->memOutHB_fx[hStereoICBWE->prev_refChanIndx_bwe][i], Incr ), hStereoICBWE->memOutHB_fx[refChanIndx_bwe][i], Decr ) ); +#endif + move32(); + } + } + ELSE + { + Copy32( hStereoICBWE->memOutHB_fx[refChanIndx_bwe], temp0_fx, memOffset ); + Copy32( hStereoICBWE->memOutHB_fx[!refChanIndx_bwe], temp1_fx, memOffset ); + } + } + + IF( EQ_16( hCPE->nchan_out, 1 ) ) + { +#ifdef FIX_826_PRECISION_LOST_AND_COMPL + Word64 W_tmp; +#endif + /* stereo to mono downmix */ + FOR( i = 0; i < output_frame; i++ ) + { +#ifndef FIX_826_PRECISION_LOST_AND_COMPL + temp0_fx[i] = L_add( temp0_fx[i], temp1_fx[i] ); + move32(); + temp0_fx[i] = L_shr( temp0_fx[i], 1 ); + move32(); + output[0][i] = L_add( output[0][i], temp0_fx[i] ); +#else + W_tmp = W_mult_32_16( output[0][i], 32767 ); + W_tmp = W_mac_32_16( W_tmp, temp0_fx[i], 16384 ); + output[0][i] = W_round48_L( W_mac_32_16( W_tmp, temp1_fx[i], 16384 ) ); + move32(); + +#endif + move32(); + } + } + ELSE + { + v_add_32( temp0_fx, output[0], output[0], output_frame ); + v_add_32( temp1_fx, output[1], output[1], output_frame ); + } + + Copy32( outputHB[0] + output_frame - memOffset, hStereoICBWE->memOutHB_fx[0], memOffset ); + Copy32( outputHB[1] + output_frame - memOffset, hStereoICBWE->memOutHB_fx[1], memOffset ); + + IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) + { + /*win_dft = hCPE->hStereoDft->win32ms;*/ + win_dft_fx = hCPE->hStereoDft->win32ms_fx; + dftOvlLen = hCPE->hStereoDft->dft32ms_ovl; + move16(); + + /* Preparing buffers in anticipation of an ACELP to TCX switch */ + +#ifndef FIX_826_PRECISION_LOST_AND_COMPL + j = 0; + move16(); +#else + j = sub( dftOvlLen, 1 ); +#endif + FOR( i = 0; i < memOffset; i++ ) + { +#ifndef FIX_826_PRECISION_LOST_AND_COMPL + Word16 tmp_mul = mult0( STEREO_DFT32MS_STEP, ( sub( dftOvlLen, add( 1, j ) ) ) ); + hStereoICBWE->memTransitionHB_fx[0][i] = Mpy_32_16_1( hStereoICBWE->memOutHB_fx[0][i], win_dft_fx[tmp_mul] ); + move32(); + hStereoICBWE->memTransitionHB_fx[1][i] = Mpy_32_16_1( hStereoICBWE->memOutHB_fx[1][i], win_dft_fx[tmp_mul] ); + move32(); + j = add( j, 1 ); +#else + Word16 tmp_mul = i_mult( STEREO_DFT32MS_STEP, j ); + hStereoICBWE->memTransitionHB_fx[0][i] = Mpy_32_16_1( hStereoICBWE->memOutHB_fx[0][i], win_dft_fx[tmp_mul] ); + move32(); + hStereoICBWE->memTransitionHB_fx[1][i] = Mpy_32_16_1( hStereoICBWE->memOutHB_fx[1][i], win_dft_fx[tmp_mul] ); + move32(); + j = sub( j, 1 ); +#endif + } + +#ifndef FIX_826_PRECISION_LOST_AND_COMPL + FOR( i = 0; j < dftOvlLen; i++ ) +#else + FOR( i = 0; i < dftOvlLen; i++ ) +#endif + { +#ifndef FIX_826_PRECISION_LOST_AND_COMPL + Word16 tmp_mul = mult0( STEREO_DFT32MS_STEP, ( sub( dftOvlLen, add( 1, j ) ) ) ); + hStereoICBWE->memTransitionHB_fx[0][memOffset + i] = Mpy_32_16_1( outputHB[0][output_frame - i - 1], win_dft_fx[tmp_mul] ); + move32(); + hStereoICBWE->memTransitionHB_fx[1][memOffset + i] = Mpy_32_16_1( outputHB[1][output_frame - i - 1], win_dft_fx[tmp_mul] ); + move32(); + j = add( j, 1 ); +#else + Word16 tmp_mul = i_mult( STEREO_DFT32MS_STEP, j ); + hStereoICBWE->memTransitionHB_fx[0][memOffset + i] = Mpy_32_16_1( outputHB[0][output_frame - i - 1], win_dft_fx[tmp_mul] ); + move32(); + hStereoICBWE->memTransitionHB_fx[1][memOffset + i] = Mpy_32_16_1( outputHB[1][output_frame - i - 1], win_dft_fx[tmp_mul] ); + move32(); + j = sub( j, 1 ); +#endif + } + } + + hStereoICBWE->prev_refChanIndx_bwe = refChanIndx_bwe; + move16(); + } + ELSE + { + IF( last_core == ACELP_CORE ) + { + IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) ) + { + v_add_32( output[0], hStereoICBWE->memOutHB_fx[hStereoICBWE->prev_refChanIndx_bwe], output[0], memOffset ); + v_add_32( output[1], hStereoICBWE->memOutHB_fx[!hStereoICBWE->prev_refChanIndx_bwe], output[1], memOffset ); + } + ELSE + { + /* This is generated in the ACELP frame and windowed. This process is akin to GenTransition for IC-BWE */ + v_add_32( output[0], hStereoICBWE->memTransitionHB_fx[hStereoICBWE->prev_refChanIndx_bwe], output[0], NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + v_add_32( output[1], hStereoICBWE->memTransitionHB_fx[!hStereoICBWE->prev_refChanIndx_bwe], output[1], NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + } + + set32_fx( hStereoICBWE->memOutHB_fx[0], 0, memOffset ); + set32_fx( hStereoICBWE->memOutHB_fx[1], 0, memOffset ); + + set32_fx( hStereoICBWE->memTransitionHB_fx[0], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + set32_fx( hStereoICBWE->memTransitionHB_fx[1], 0, NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) ); + } + } + } + ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && hCPE->hCoreCoder[0]->tdm_LRTD_flag && hStereoICBWE != NULL ) + { + stereo_icBWE_init_dec_fx( hCPE->hStereoICBWE ); + } + ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) && EQ_16( hCPE->last_element_mode, IVAS_CPE_DFT ) && EQ_16( last_core, ACELP_CORE ) ) + { + Word16 delay_tdbwe = NS2SA( output_Fs, DELAY_BWE_TOTAL_NS ); + + FOR( n = 0; n < hCPE->nchan_out; n++ ) + { + FOR( i = 0; i < delay_tdbwe; i++ ) + { + output[n][NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) - delay_tdbwe + i] = L_add_sat( output[n][NS2SA( output_Fs, STEREO_DFT32MS_OVL_NS ) - delay_tdbwe + i], outputHB[0][i] ); + move32(); + } + } + /* reset BWE structs as they are only needed in the transition frame in MDCT Stereo */ + td_bwe_dec_init_ivas_fx( hCPE->hCoreCoder[0], hCPE->hCoreCoder[0]->hBWE_TD, output_Fs ); + fd_bwe_dec_init( hCPE->hCoreCoder[0], hCPE->hCoreCoder[0]->hBWE_FD ); + } + + test(); + IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && GT_32( L_max( hCPE->hStereoDft->td_gain_fx[0], hCPE->hStereoDft->td_gain_fx[1] ), 0 ) ) + { +#ifdef FIX_826_PRECISION_LOST_AND_COMPL + Word32 win_in_fx, win_out_fx, tmp_fx; + Word64 W_tmp, W_tmp1; +#else + Word32 win_in_fx, win_out_fx, tmp_fx, gain0_fx, gain1_fx; +#endif + win_dft_fx = hCPE->hStereoDft->win32ms_fx; + dftOvlLen = hCPE->hStereoDft->dft32ms_ovl; + move16(); + + // Scale_sig32(hCPE->hStereoDft->td_gain_fx, STEREO_DFT_CORE_HIST_MAX, -12); + + FOR( i = 0; i < dftOvlLen; i++ ) + { +#ifdef FIX_826_PRECISION_LOST_AND_COMPL + j = i_mult( STEREO_DFT32MS_STEP, i ); + win_in_fx = L_mult( win_dft_fx[j], win_dft_fx[j] ); /* Q31 */ + win_out_fx = L_sub( ONE_IN_Q31, win_in_fx ); /* Q31 */ + /* hCPE->hStereoDft->q_hb_stefi_sig_fx is always 31 here */ + /* tmp = ( win_in * hCPE->hStereoDft->td_gain[0] + win_out * hCPE->hStereoDft->td_gain[1] ) * hCPE->hStereoDft->hb_stefi_sig[i]; */ + + W_tmp = W_mult_32_32( hCPE->hStereoDft->td_gain_fx[0], win_in_fx ); + if ( hCPE->hStereoDft->q_td_gain[0] != 0 ) + { + W_tmp = W_shl( W_tmp, sub( 31, hCPE->hStereoDft->q_td_gain[0] ) ); + } + W_tmp1 = W_mult_32_32( hCPE->hStereoDft->td_gain_fx[1], win_out_fx ); + if ( hCPE->hStereoDft->q_td_gain[1] != 0 ) + { + W_tmp1 = W_shl( W_tmp1, sub( 31, hCPE->hStereoDft->q_td_gain[1] ) ); + } + tmp_fx = W_extract_h( W_add_nosat( W_tmp, W_tmp1 ) ); + tmp_fx = W_extract_h( W_mult_32_32( tmp_fx, hCPE->hStereoDft->hb_stefi_sig_fx[i] ) ); + + output[0][i] = L_add_sat( output[0][i], tmp_fx ); + move32(); + output[1][i] = L_sub_sat( output[1][i], tmp_fx ); + move32(); +#else + win_in_fx = L_mult( win_dft_fx[mult0( STEREO_DFT32MS_STEP, i )], win_dft_fx[mult0( STEREO_DFT32MS_STEP, i )] ); /* Q31 */ + win_out_fx = L_sub( ONE_IN_Q31, win_in_fx ); /* Q31 */ + + gain0_fx = Mpy_32_32( win_in_fx, hCPE->hStereoDft->td_gain_fx[0] ); /* Q --> q_td_gain[0] */ +#ifdef FIX_736_BWE_SECT_C + gain0_fx = (Word32) W_shr( ( (Word64) gain0_fx * hCPE->hStereoDft->hb_stefi_sig_fx[i] ), sub( add( (Word16) hCPE->hStereoDft->q_td_gain[0], hCPE->hStereoDft->q_hb_stefi_sig_fx ), 2 * q_output + 14 ) ); /* Q --> q_output */ + gain1_fx = Mpy_32_32( win_out_fx, hCPE->hStereoDft->td_gain_fx[1] ); /* Q --> q_td_gain[1] */ + gain1_fx = (Word32) W_shr( ( (Word64) gain1_fx * hCPE->hStereoDft->hb_stefi_sig_fx[i] ), sub( add( (Word16) hCPE->hStereoDft->q_td_gain[1], hCPE->hStereoDft->q_hb_stefi_sig_fx ), 2 * q_output + 14 ) ); /* Q --> q_output */ +#else + gain0_fx = (Word32) W_shr( ( (Word64) gain0_fx * hCPE->hStereoDft->hb_stefi_sig_fx[i] ), sub( add( (Word16) hCPE->hStereoDft->q_td_gain[0], hCPE->hStereoDft->q_hb_stefi_sig_fx ), q_output ) ); /* Q --> q_output */ + gain1_fx = Mpy_32_32( win_out_fx, hCPE->hStereoDft->td_gain_fx[1] ); /* Q --> q_td_gain[1] */ + gain1_fx = (Word32) W_shr( ( (Word64) gain1_fx * hCPE->hStereoDft->hb_stefi_sig_fx[i] ), sub( add( (Word16) hCPE->hStereoDft->q_td_gain[1], hCPE->hStereoDft->q_hb_stefi_sig_fx ), q_output ) ); /* Q --> q_output */ +#endif + tmp_fx = L_add_sat( gain0_fx, gain1_fx ); /* Q --> q_output */ + + output[0][i] = L_add_sat( output[0][i], tmp_fx ); + move32(); + output[1][i] = L_sub_sat( output[1][i], tmp_fx ); + move32(); +#endif + } + FOR( i = dftOvlLen; i < output_frame; i++ ) + { +#ifdef FIX_826_PRECISION_LOST_AND_COMPL + tmp_fx = W_extract_h( W_mult_32_32( hCPE->hStereoDft->td_gain_fx[0], hCPE->hStereoDft->hb_stefi_sig_fx[i] ) ); /* Q11 --> Q11 */ +#else +#ifdef FIX_736_BWE_SECT_C + tmp_fx = (Word32) W_shr( ( (Word64) hCPE->hStereoDft->td_gain_fx[0] * hCPE->hStereoDft->hb_stefi_sig_fx[i] ), sub( add( (Word16) hCPE->hStereoDft->q_td_gain[0], hCPE->hStereoDft->q_hb_stefi_sig_fx ), 2 * q_output + 14 ) ); /* Q --> q_output */ +#else + tmp_fx = (Word32) W_shr( ( (Word64) hCPE->hStereoDft->td_gain_fx[0] * hCPE->hStereoDft->hb_stefi_sig_fx[i] ), sub( add( (Word16) hCPE->hStereoDft->q_td_gain[0], hCPE->hStereoDft->q_hb_stefi_sig_fx ), q_output ) ); /* Q --> q_output */ +#endif +#endif + output[0][i] = L_add_sat( output[0][i], tmp_fx ); + move32(); + output[1][i] = L_sub_sat( output[1][i], tmp_fx ); + move32(); + } + } + + return; +} +#endif + +/*-------------------------------------------------------------------* + * stereo_icBWE_init_dec() + * + * Stereo (inter-channel) BWE mapping - decoder initialization + *-------------------------------------------------------------------*/ + +#ifndef IVAS_FLOAT_FIXED +void stereo_icBWE_init_dec( + STEREO_ICBWE_DEC_HANDLE hStereoICBWE /* i/o: Stereo inter-channel BWE handle */ +) +{ + /* BWE ref channel */ + hStereoICBWE->refChanIndx_bwe = L_CH_INDX; + hStereoICBWE->prev_refChanIndx_bwe = L_CH_INDX; + + /* SHB output memory */ + set_f( hStereoICBWE->memOutHB[0], 0, NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) ); + set_f( hStereoICBWE->memOutHB[1], 0, NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) ); + + + /* SHB output memory */ + set_f( hStereoICBWE->memTransitionHB[0], 0, NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) ); + set_f( hStereoICBWE->memTransitionHB[1], 0, NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) ); + + /* inter-channel BWE spectral shape adj. */ + hStereoICBWE->prevSpecMapping = 0; + hStereoICBWE->prevgsMapping = 1.0f; + + hStereoICBWE->icbweM2Ref_prev = 1.0f; + + hStereoICBWE->prev_spIndx = 0; + hStereoICBWE->prev_gsIndx = 0; + + ic_bwe_dec_reset( hStereoICBWE ); + return; +} +#else +void stereo_icBWE_init_dec_fx( + STEREO_ICBWE_DEC_HANDLE hStereoICBWE /* i/o: Stereo inter-channel BWE handle */ +) +{ + /* BWE ref channel */ + hStereoICBWE->refChanIndx_bwe = L_CH_INDX; + move16(); + hStereoICBWE->prev_refChanIndx_bwe = L_CH_INDX; + move16(); + + /* SHB output memory */ + set32_fx( hStereoICBWE->memOutHB_fx[0], 0, NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) ); + set32_fx( hStereoICBWE->memOutHB_fx[1], 0, NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ) ); + + + /* SHB output memory */ + set32_fx( hStereoICBWE->memTransitionHB_fx[0], 0, NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) ); + set32_fx( hStereoICBWE->memTransitionHB_fx[1], 0, NS2SA( 48000, STEREO_DFT32MS_OVL_NS ) ); + + /* inter-channel BWE spectral shape adj. */ + hStereoICBWE->prevSpecMapping_fx = 0; + move16(); + hStereoICBWE->prevgsMapping_fx = 16384; + move16(); + hStereoICBWE->icbweM2Ref_prev_fx = 16384; + move16(); + + hStereoICBWE->prev_spIndx = 0; + move16(); + hStereoICBWE->prev_gsIndx = 0; + move16(); + + ic_bwe_dec_reset_fx( hStereoICBWE ); + + return; +} +#endif diff --git a/lib_enc/igf_enc_fx.c b/lib_enc/igf_enc_fx.c index be687de6d..61b844fde 100644 --- a/lib_enc/igf_enc_fx.c +++ b/lib_enc/igf_enc_fx.c @@ -13,7 +13,6 @@ #include "prot_fx_enc.h" /* Function prototypes */ #include "stat_enc.h" #include "basop_util.h" -/*AddedByWMC_Tool*/#include "wmc_auto.h" /**********************************************************************/ /* write single bit to stream -- GitLab From f84e5b07ec7a1a9e9d2c6b4a915bb491efe6f1d6 Mon Sep 17 00:00:00 2001 From: Tommy Vaillancourt Date: Wed, 7 Aug 2024 09:14:06 -0400 Subject: [PATCH 3/3] FIX 833 to fix issue introduced in 826 --- lib_com/options.h | 4 ++++ lib_dec/ivas_stereo_icbwe_dec.c | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 2361ee218..ab59819f7 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -154,6 +154,10 @@ #define FIX_802_1137_1137_GSC_IVAS_FXFLT_DECODING /* VA: ISSUES 802 and 1137 Made sure that float and fixed point GCS bit allocation is the same during IVAS modes */ #define FIX_810_PREVENT_UNECESSARY_SAT_IN_TC /* VA : Prevent an unnecessary saturation that can happen in TC, have a minimal impact on most cases. Significant improvement for the last segment of LTV when TC is triggered */ #define FIX_826_PRECISION_LOST_AND_COMPL /* VA : Fix lost of precision that leads to unnecessary high noise floor and to some framing artifacts */ +#ifdef FIX_826_PRECISION_LOST_AND_COMPL +#define FIX_833_CORRECTION_to_826 /* VA : fix indexing error introduced in 826 */ +#endif + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_dec/ivas_stereo_icbwe_dec.c b/lib_dec/ivas_stereo_icbwe_dec.c index d5acccc7a..89faf3559 100644 --- a/lib_dec/ivas_stereo_icbwe_dec.c +++ b/lib_dec/ivas_stereo_icbwe_dec.c @@ -2145,13 +2145,13 @@ void stereo_icBWE_decproc_fx( #endif } -#ifndef FIX_826_PRECISION_LOST_AND_COMPL +#if !defined FIX_826_PRECISION_LOST_AND_COMPL || defined FIX_833_CORRECTION_to_826 FOR( i = 0; j < dftOvlLen; i++ ) #else FOR( i = 0; i < dftOvlLen; i++ ) #endif { -#ifndef FIX_826_PRECISION_LOST_AND_COMPL +#if !defined FIX_826_PRECISION_LOST_AND_COMPL || defined FIX_833_CORRECTION_to_826 Word16 tmp_mul = mult0( STEREO_DFT32MS_STEP, ( sub( dftOvlLen, add( 1, j ) ) ) ); hStereoICBWE->memTransitionHB_fx[0][memOffset + i] = Mpy_32_16_1( outputHB[0][output_frame - i - 1], win_dft_fx[tmp_mul] ); move32(); -- GitLab