Loading Workspace_msvc/ambi_converter.vcxproj +4 −0 Original line number Diff line number Diff line Loading @@ -160,6 +160,10 @@ <Project>{2FA8F384-0775-F3B7-F8C3-85209222FC70}</Project> <ReferenceOutputAssembly>false</ReferenceOutputAssembly> </ProjectReference> <ProjectReference Include="lib_debug.vcxproj"> <Project>{54509728-928B-44D9-A118-A6F92F08B34F}</Project> <ReferenceOutputAssembly>false</ReferenceOutputAssembly> </ProjectReference> </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> Loading apps/renderer.c +53 −5 Original line number Diff line number Diff line Loading @@ -3108,6 +3108,13 @@ void getMetadataFromFileReader( fprintf( stderr, "\nError (%s) while reading ISM metadata from: %s\n\n", ivas_error_to_string( error ), IsmFileReader_getFilePath( ismReader ) ); exit( -1 ); } #ifdef FIX_2084_FLOATING_POINT_LEFTOVERS objectMetadataBuffer->positions[objIdx].azimuth_fx = ismMetadata.azimuth_fx; objectMetadataBuffer->positions[objIdx].elevation_fx = ismMetadata.elevation_fx; objectMetadataBuffer->positions[objIdx].radius_fx = ismMetadata.radius_fx; objectMetadataBuffer->positions[objIdx].yaw_fx = ismMetadata.yaw_fx; objectMetadataBuffer->positions[objIdx].pitch_fx = ismMetadata.pitch_fx; #else objectMetadataBuffer->positions[objIdx].azimuth_fx = (Word32) ( ismMetadata.azimuth * ( 1 << 22 ) ); objectMetadataBuffer->positions[objIdx].elevation_fx = (Word32) ( ismMetadata.elevation * ( 1 << 22 ) ); objectMetadataBuffer->positions[objIdx].radius_fx = (Word16) ( ismMetadata.radius * ( 1 << 9 ) ); Loading @@ -3119,6 +3126,7 @@ void getMetadataFromFileReader( objectMetadataBuffer->positions[objIdx].radius = ismMetadata.radius; objectMetadataBuffer->positions[objIdx].yaw = ismMetadata.yaw; objectMetadataBuffer->positions[objIdx].pitch = ismMetadata.pitch; #endif objectMetadataBuffer->positions[objIdx].non_diegetic_flag = ismMetadata.non_diegetic_flag; return; Loading Loading @@ -3172,20 +3180,50 @@ static void IsmPositionProvider_getNextFrame( /* Otherwise fall back to default position */ else { #ifdef FIX_2084_FLOATING_POINT_LEFTOVERS objectMetadataBuffer->positions[objIdx].azimuth_fx = 0; objectMetadataBuffer->positions[objIdx].elevation_fx = 0; objectMetadataBuffer->positions[objIdx].radius_fx = 512; // 1.f in Q9 objectMetadataBuffer->positions[objIdx].yaw_fx = 0; objectMetadataBuffer->positions[objIdx].pitch_fx = 0; objectMetadataBuffer->positions[objIdx].non_diegetic_flag = 0; #else objectMetadataBuffer->positions[objIdx].azimuth = 0.0f; objectMetadataBuffer->positions[objIdx].elevation = 0.0f; objectMetadataBuffer->positions[objIdx].radius = 1.0f; objectMetadataBuffer->positions[objIdx].yaw = 0.0f; objectMetadataBuffer->positions[objIdx].pitch = 0.0f; objectMetadataBuffer->positions[objIdx].azimuth_fx = 0; objectMetadataBuffer->positions[objIdx].elevation_fx = 0; objectMetadataBuffer->positions[objIdx].radius_fx = 512; objectMetadataBuffer->positions[objIdx].yaw_fx = 0; objectMetadataBuffer->positions[objIdx].pitch_fx = 0; objectMetadataBuffer->positions[objIdx].non_diegetic_flag = 0; #endif } /* Wrap azimuth to lie within (-180, 180] range */ #ifdef FIX_2084_FLOATING_POINT_LEFTOVERS while ( LT_32( objectMetadataBuffer->positions[objIdx].azimuth_fx, 0 ) ) { objectMetadataBuffer->positions[objIdx].azimuth_fx = L_add( objectMetadataBuffer->positions[objIdx].azimuth_fx, DEG_360_IN_Q22 ); } while ( GE_32( objectMetadataBuffer->positions[objIdx].azimuth_fx, DEG_360_IN_Q22 ) ) { objectMetadataBuffer->positions[objIdx].azimuth_fx = L_sub( objectMetadataBuffer->positions[objIdx].azimuth_fx, DEG_360_IN_Q22 ); } /* Clamp elevation to lie within [-90, 90] range (can't be wrapped easily) */ objectMetadataBuffer->positions[objIdx].elevation_fx = L_min( L_max( objectMetadataBuffer->positions[objIdx].elevation_fx, -DEG_90_IN_Q22 ), DEG_90_IN_Q22 ); /* Wrap yaw to lie within (-180, 180] range */ while ( LT_32( objectMetadataBuffer->positions[objIdx].yaw_fx, 0 ) ) { objectMetadataBuffer->positions[objIdx].yaw_fx = L_add( objectMetadataBuffer->positions[objIdx].yaw_fx, DEG_360_IN_Q22 ); } while ( GE_32( objectMetadataBuffer->positions[objIdx].yaw_fx, DEG_360_IN_Q22 ) ) { objectMetadataBuffer->positions[objIdx].yaw_fx = L_sub( objectMetadataBuffer->positions[objIdx].yaw_fx, DEG_360_IN_Q22 ); } /* Clamp pitch to lie within [-90, 90] range (can't be wrapped easily) */ objectMetadataBuffer->positions[objIdx].pitch_fx = L_min( L_max( objectMetadataBuffer->positions[objIdx].pitch_fx, -DEG_90_IN_Q22 ), DEG_90_IN_Q22 ); #else while ( objectMetadataBuffer->positions[objIdx].azimuth < 0.0f ) { objectMetadataBuffer->positions[objIdx].azimuth += 360.0f; Loading Loading @@ -3213,6 +3251,7 @@ static void IsmPositionProvider_getNextFrame( objectMetadataBuffer->positions[objIdx].pitch = min( max( objectMetadataBuffer->positions[objIdx].pitch, -90 ), 90 ); objectMetadataBuffer->positions[objIdx].yaw_fx = (Word32) ( ( objectMetadataBuffer->positions[objIdx].yaw ) * ( 1 << Q22 ) ); objectMetadataBuffer->positions[objIdx].pitch_fx = (Word32) ( ( objectMetadataBuffer->positions[objIdx].pitch ) * ( 1 << Q22 ) ); #endif } ++positionProvider->frameCounter; Loading Loading @@ -3517,6 +3556,14 @@ static void parseObjectPosition( exit( -1 ); } #ifdef FIX_2084_FLOATING_POINT_LEFTOVERS position->azimuth_fx = (Word32) ( meta_prm[0] * ( 1 << Q22 ) ); /* Q22 */ position->elevation_fx = (Word32) ( meta_prm[1] * ( 1 << Q22 ) ); /* Q22 */ position->radius_fx = (Word16) ( meta_prm[2] * ( 1 << Q9 ) ); /* Q9 */ position->yaw_fx = (Word32) ( meta_prm[5] * ( 1 << Q22 ) ); /* Q22 */ position->pitch_fx = (Word32) ( meta_prm[6] * ( 1 << Q22 ) ); /* Q22 */ position->non_diegetic_flag = (Word16) meta_prm[7]; #else position->azimuth = meta_prm[0]; position->elevation = meta_prm[1]; position->azimuth_fx = (Word32) ( meta_prm[0] * ( 1 << 22 ) ); Loading @@ -3525,6 +3572,7 @@ static void parseObjectPosition( position->yaw = meta_prm[5]; position->pitch = meta_prm[6]; position->non_diegetic_flag = (int16_t) meta_prm[7]; #endif return; } Loading lib_com/common_api_types.h +2 −0 Original line number Diff line number Diff line Loading @@ -133,6 +133,7 @@ typedef struct _IVAS_ISM_METADATA Word32 gainFactor_fx; /* Q29 */ Word32 yaw_fx; /* Q22 */ Word32 pitch_fx; /* Q22 */ #ifndef FIX_2084_FLOATING_POINT_LEFTOVERS float azimuth; float elevation; float radius; Loading @@ -140,6 +141,7 @@ typedef struct _IVAS_ISM_METADATA float gainFactor; float yaw; float pitch; #endif Word16 non_diegetic_flag; Word32 gain_fx; /* Q29 */ Loading lib_com/ivas_cnst.h +4 −0 Original line number Diff line number Diff line Loading @@ -195,7 +195,11 @@ typedef enum #define MAX_JBM_L_FRAME48k 1920 #define MAX_JBM_L_FRAME_NS 40000000L #define MAX_SPAR_INTERNAL_CHANNELS IVAS_SPAR_MAX_CH #ifdef UNIFIED_DECODING_PATHS_LEFTOVERS #define MAX_CLDFB_DIGEST_CHANNELS 3 /* == maximum of ParamISM TCs and ParamMC TCs */ #else #define MAX_CLDFB_DIGEST_CHANNELS (FOA_CHANNELS + MAX_NUM_OBJECTS) #endif typedef enum { Loading lib_com/ivas_limiter_fx.c +10 −41 Original line number Diff line number Diff line Loading @@ -41,14 +41,12 @@ #include <assert.h> #include "ivas_prot_fx.h" #ifdef FIX_2089_NONBE_LIMITER_CONSTS #define RELEASE_CNST_20MS ( 85899345 ) // Q30 #define RELEASE_CNST_2_20MS ( 21474836 ) // Q30 #define RELEASE_CNST_10MS ( 42949672 ) // Q30 #define RELEASE_CNST_2_10MS ( 10737418 ) // Q30 #define RELEASE_CNST_5MS ( 21474836 ) // Q30 #define RELEASE_CNST_2_5MS ( 5368709 ) // Q30 #endif #define ATTACK_CNST_48k ( 2106670080 ) // Q31 #define ATTACK_CNST_32k ( 2086555136 ) // Q31 #define ATTACK_CNST_16k ( 2027355264 ) // Q31 Loading Loading @@ -355,7 +353,6 @@ void limiter_process_fx( * keep the gain curve smoother if the threshold is exceeded in many frames * in a short span of time. */ #ifdef FIX_2089_NONBE_LIMITER_CONSTS IF( EQ_32( L_mult0( output_frame, 50 ), hLimiter->sampling_rate ) ) { releaseHeuristic_cnst = RELEASE_CNST_20MS; Loading @@ -379,7 +376,6 @@ void limiter_process_fx( } ELSE { #ifdef FIX_2089_NONBE_LIMITER_CONSTS_WITH_DIV // computing output_frame/hLimiter->sampling_rate in Q30 i = norm_s( output_frame ); c = norm_l( hLimiter->sampling_rate ); Loading @@ -394,35 +390,8 @@ void limiter_process_fx( i = sub( sub( c, i ), 1 ); // Q30 releaseHeuristic_cnst_2 = L_shl( scale, i ); releaseHeuristic_cnst = L_shl( releaseHeuristic_cnst_2, 2 ); #else /* or same default values as previous code version */ releaseHeuristic_cnst = RELEASE_CNST_5MS; move32(); releaseHeuristic_cnst_2 = RELEASE_CNST_2_5MS; move32(); #endif } #else SWITCH( output_frame ) { case 960: case 640: case 320: case 160: releaseHeuristic_cnst = 85899345; /*Q30*/ move32(); releaseHeuristic_cnst_2 = 21474836; /*Q30*/ move32(); BREAK; default: releaseHeuristic_cnst = 21474836; /*Q30*/ move32(); releaseHeuristic_cnst_2 = 5368709; /*Q30*/ move32(); BREAK; } #endif releaseHeuristic = hLimiter->release_heuristic_fx; /* Q30 */ move32(); Loading Loading
Workspace_msvc/ambi_converter.vcxproj +4 −0 Original line number Diff line number Diff line Loading @@ -160,6 +160,10 @@ <Project>{2FA8F384-0775-F3B7-F8C3-85209222FC70}</Project> <ReferenceOutputAssembly>false</ReferenceOutputAssembly> </ProjectReference> <ProjectReference Include="lib_debug.vcxproj"> <Project>{54509728-928B-44D9-A118-A6F92F08B34F}</Project> <ReferenceOutputAssembly>false</ReferenceOutputAssembly> </ProjectReference> </ItemGroup> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <ImportGroup Label="ExtensionTargets"> Loading
apps/renderer.c +53 −5 Original line number Diff line number Diff line Loading @@ -3108,6 +3108,13 @@ void getMetadataFromFileReader( fprintf( stderr, "\nError (%s) while reading ISM metadata from: %s\n\n", ivas_error_to_string( error ), IsmFileReader_getFilePath( ismReader ) ); exit( -1 ); } #ifdef FIX_2084_FLOATING_POINT_LEFTOVERS objectMetadataBuffer->positions[objIdx].azimuth_fx = ismMetadata.azimuth_fx; objectMetadataBuffer->positions[objIdx].elevation_fx = ismMetadata.elevation_fx; objectMetadataBuffer->positions[objIdx].radius_fx = ismMetadata.radius_fx; objectMetadataBuffer->positions[objIdx].yaw_fx = ismMetadata.yaw_fx; objectMetadataBuffer->positions[objIdx].pitch_fx = ismMetadata.pitch_fx; #else objectMetadataBuffer->positions[objIdx].azimuth_fx = (Word32) ( ismMetadata.azimuth * ( 1 << 22 ) ); objectMetadataBuffer->positions[objIdx].elevation_fx = (Word32) ( ismMetadata.elevation * ( 1 << 22 ) ); objectMetadataBuffer->positions[objIdx].radius_fx = (Word16) ( ismMetadata.radius * ( 1 << 9 ) ); Loading @@ -3119,6 +3126,7 @@ void getMetadataFromFileReader( objectMetadataBuffer->positions[objIdx].radius = ismMetadata.radius; objectMetadataBuffer->positions[objIdx].yaw = ismMetadata.yaw; objectMetadataBuffer->positions[objIdx].pitch = ismMetadata.pitch; #endif objectMetadataBuffer->positions[objIdx].non_diegetic_flag = ismMetadata.non_diegetic_flag; return; Loading Loading @@ -3172,20 +3180,50 @@ static void IsmPositionProvider_getNextFrame( /* Otherwise fall back to default position */ else { #ifdef FIX_2084_FLOATING_POINT_LEFTOVERS objectMetadataBuffer->positions[objIdx].azimuth_fx = 0; objectMetadataBuffer->positions[objIdx].elevation_fx = 0; objectMetadataBuffer->positions[objIdx].radius_fx = 512; // 1.f in Q9 objectMetadataBuffer->positions[objIdx].yaw_fx = 0; objectMetadataBuffer->positions[objIdx].pitch_fx = 0; objectMetadataBuffer->positions[objIdx].non_diegetic_flag = 0; #else objectMetadataBuffer->positions[objIdx].azimuth = 0.0f; objectMetadataBuffer->positions[objIdx].elevation = 0.0f; objectMetadataBuffer->positions[objIdx].radius = 1.0f; objectMetadataBuffer->positions[objIdx].yaw = 0.0f; objectMetadataBuffer->positions[objIdx].pitch = 0.0f; objectMetadataBuffer->positions[objIdx].azimuth_fx = 0; objectMetadataBuffer->positions[objIdx].elevation_fx = 0; objectMetadataBuffer->positions[objIdx].radius_fx = 512; objectMetadataBuffer->positions[objIdx].yaw_fx = 0; objectMetadataBuffer->positions[objIdx].pitch_fx = 0; objectMetadataBuffer->positions[objIdx].non_diegetic_flag = 0; #endif } /* Wrap azimuth to lie within (-180, 180] range */ #ifdef FIX_2084_FLOATING_POINT_LEFTOVERS while ( LT_32( objectMetadataBuffer->positions[objIdx].azimuth_fx, 0 ) ) { objectMetadataBuffer->positions[objIdx].azimuth_fx = L_add( objectMetadataBuffer->positions[objIdx].azimuth_fx, DEG_360_IN_Q22 ); } while ( GE_32( objectMetadataBuffer->positions[objIdx].azimuth_fx, DEG_360_IN_Q22 ) ) { objectMetadataBuffer->positions[objIdx].azimuth_fx = L_sub( objectMetadataBuffer->positions[objIdx].azimuth_fx, DEG_360_IN_Q22 ); } /* Clamp elevation to lie within [-90, 90] range (can't be wrapped easily) */ objectMetadataBuffer->positions[objIdx].elevation_fx = L_min( L_max( objectMetadataBuffer->positions[objIdx].elevation_fx, -DEG_90_IN_Q22 ), DEG_90_IN_Q22 ); /* Wrap yaw to lie within (-180, 180] range */ while ( LT_32( objectMetadataBuffer->positions[objIdx].yaw_fx, 0 ) ) { objectMetadataBuffer->positions[objIdx].yaw_fx = L_add( objectMetadataBuffer->positions[objIdx].yaw_fx, DEG_360_IN_Q22 ); } while ( GE_32( objectMetadataBuffer->positions[objIdx].yaw_fx, DEG_360_IN_Q22 ) ) { objectMetadataBuffer->positions[objIdx].yaw_fx = L_sub( objectMetadataBuffer->positions[objIdx].yaw_fx, DEG_360_IN_Q22 ); } /* Clamp pitch to lie within [-90, 90] range (can't be wrapped easily) */ objectMetadataBuffer->positions[objIdx].pitch_fx = L_min( L_max( objectMetadataBuffer->positions[objIdx].pitch_fx, -DEG_90_IN_Q22 ), DEG_90_IN_Q22 ); #else while ( objectMetadataBuffer->positions[objIdx].azimuth < 0.0f ) { objectMetadataBuffer->positions[objIdx].azimuth += 360.0f; Loading Loading @@ -3213,6 +3251,7 @@ static void IsmPositionProvider_getNextFrame( objectMetadataBuffer->positions[objIdx].pitch = min( max( objectMetadataBuffer->positions[objIdx].pitch, -90 ), 90 ); objectMetadataBuffer->positions[objIdx].yaw_fx = (Word32) ( ( objectMetadataBuffer->positions[objIdx].yaw ) * ( 1 << Q22 ) ); objectMetadataBuffer->positions[objIdx].pitch_fx = (Word32) ( ( objectMetadataBuffer->positions[objIdx].pitch ) * ( 1 << Q22 ) ); #endif } ++positionProvider->frameCounter; Loading Loading @@ -3517,6 +3556,14 @@ static void parseObjectPosition( exit( -1 ); } #ifdef FIX_2084_FLOATING_POINT_LEFTOVERS position->azimuth_fx = (Word32) ( meta_prm[0] * ( 1 << Q22 ) ); /* Q22 */ position->elevation_fx = (Word32) ( meta_prm[1] * ( 1 << Q22 ) ); /* Q22 */ position->radius_fx = (Word16) ( meta_prm[2] * ( 1 << Q9 ) ); /* Q9 */ position->yaw_fx = (Word32) ( meta_prm[5] * ( 1 << Q22 ) ); /* Q22 */ position->pitch_fx = (Word32) ( meta_prm[6] * ( 1 << Q22 ) ); /* Q22 */ position->non_diegetic_flag = (Word16) meta_prm[7]; #else position->azimuth = meta_prm[0]; position->elevation = meta_prm[1]; position->azimuth_fx = (Word32) ( meta_prm[0] * ( 1 << 22 ) ); Loading @@ -3525,6 +3572,7 @@ static void parseObjectPosition( position->yaw = meta_prm[5]; position->pitch = meta_prm[6]; position->non_diegetic_flag = (int16_t) meta_prm[7]; #endif return; } Loading
lib_com/common_api_types.h +2 −0 Original line number Diff line number Diff line Loading @@ -133,6 +133,7 @@ typedef struct _IVAS_ISM_METADATA Word32 gainFactor_fx; /* Q29 */ Word32 yaw_fx; /* Q22 */ Word32 pitch_fx; /* Q22 */ #ifndef FIX_2084_FLOATING_POINT_LEFTOVERS float azimuth; float elevation; float radius; Loading @@ -140,6 +141,7 @@ typedef struct _IVAS_ISM_METADATA float gainFactor; float yaw; float pitch; #endif Word16 non_diegetic_flag; Word32 gain_fx; /* Q29 */ Loading
lib_com/ivas_cnst.h +4 −0 Original line number Diff line number Diff line Loading @@ -195,7 +195,11 @@ typedef enum #define MAX_JBM_L_FRAME48k 1920 #define MAX_JBM_L_FRAME_NS 40000000L #define MAX_SPAR_INTERNAL_CHANNELS IVAS_SPAR_MAX_CH #ifdef UNIFIED_DECODING_PATHS_LEFTOVERS #define MAX_CLDFB_DIGEST_CHANNELS 3 /* == maximum of ParamISM TCs and ParamMC TCs */ #else #define MAX_CLDFB_DIGEST_CHANNELS (FOA_CHANNELS + MAX_NUM_OBJECTS) #endif typedef enum { Loading
lib_com/ivas_limiter_fx.c +10 −41 Original line number Diff line number Diff line Loading @@ -41,14 +41,12 @@ #include <assert.h> #include "ivas_prot_fx.h" #ifdef FIX_2089_NONBE_LIMITER_CONSTS #define RELEASE_CNST_20MS ( 85899345 ) // Q30 #define RELEASE_CNST_2_20MS ( 21474836 ) // Q30 #define RELEASE_CNST_10MS ( 42949672 ) // Q30 #define RELEASE_CNST_2_10MS ( 10737418 ) // Q30 #define RELEASE_CNST_5MS ( 21474836 ) // Q30 #define RELEASE_CNST_2_5MS ( 5368709 ) // Q30 #endif #define ATTACK_CNST_48k ( 2106670080 ) // Q31 #define ATTACK_CNST_32k ( 2086555136 ) // Q31 #define ATTACK_CNST_16k ( 2027355264 ) // Q31 Loading Loading @@ -355,7 +353,6 @@ void limiter_process_fx( * keep the gain curve smoother if the threshold is exceeded in many frames * in a short span of time. */ #ifdef FIX_2089_NONBE_LIMITER_CONSTS IF( EQ_32( L_mult0( output_frame, 50 ), hLimiter->sampling_rate ) ) { releaseHeuristic_cnst = RELEASE_CNST_20MS; Loading @@ -379,7 +376,6 @@ void limiter_process_fx( } ELSE { #ifdef FIX_2089_NONBE_LIMITER_CONSTS_WITH_DIV // computing output_frame/hLimiter->sampling_rate in Q30 i = norm_s( output_frame ); c = norm_l( hLimiter->sampling_rate ); Loading @@ -394,35 +390,8 @@ void limiter_process_fx( i = sub( sub( c, i ), 1 ); // Q30 releaseHeuristic_cnst_2 = L_shl( scale, i ); releaseHeuristic_cnst = L_shl( releaseHeuristic_cnst_2, 2 ); #else /* or same default values as previous code version */ releaseHeuristic_cnst = RELEASE_CNST_5MS; move32(); releaseHeuristic_cnst_2 = RELEASE_CNST_2_5MS; move32(); #endif } #else SWITCH( output_frame ) { case 960: case 640: case 320: case 160: releaseHeuristic_cnst = 85899345; /*Q30*/ move32(); releaseHeuristic_cnst_2 = 21474836; /*Q30*/ move32(); BREAK; default: releaseHeuristic_cnst = 21474836; /*Q30*/ move32(); releaseHeuristic_cnst_2 = 5368709; /*Q30*/ move32(); BREAK; } #endif releaseHeuristic = hLimiter->release_heuristic_fx; /* Q30 */ move32(); Loading