Loading lib_com/bitstream.c +4 −0 Original line number Diff line number Diff line Loading @@ -1984,7 +1984,11 @@ ivas_error preview_indices( { st_ivas->ism_mode = ivas_omasa_ism_mode_select( total_brate, st_ivas->nchan_ism ); #ifdef OMASA_UPDATES if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) #else if ( st_ivas->ism_mode == ISM_MASA_MODE_ONE_OBJ ) #endif { st_ivas->nchan_transport = 0; } Loading lib_com/ivas_cnst.h +11 −2 Original line number Diff line number Diff line Loading @@ -307,7 +307,7 @@ typedef enum #define ISM_METADATA_VAD_FLAG_BITS 1 #define ISM_METADATA_FLAG_BITS 2 #ifdef OMASA_BRATE #ifdef MASA_AND_OBJECTS #define ISM_INACTIVE_IMP 0 /* == ISM_NO_META */ #endif #define ISM_NO_META 0 Loading @@ -315,7 +315,7 @@ typedef enum #define ISM_MEDIUM_IMP 2 #define ISM_HIGH_IMP 3 #ifdef OMASA_BRATE #ifdef MASA_AND_OBJECTS #define BRATE_ISM_INACTIVE 2450 /* CoreCoder bitrate in ISM no meta / inactive frames */ #define BITS_ISM_INACTIVE ( BRATE_ISM_INACTIVE / FRAMES_PER_SEC ) #endif Loading Loading @@ -361,7 +361,12 @@ typedef enum #ifdef MASA_AND_OBJECTS , ISM_MASA_MODE_PARAM, /* parametric ISM mode for combined MASA ISM format */ #ifdef OMASA_UPDATES ISM_MASA_MODE_MASA_ONE_OBJ, /* MASA ISM mode when one object is encoded separately and remainder using MASA parameters */ ISM_MASA_MODE_PARAM_ONE_OBJ, /* MASA ISM mode when one object is encoded separately and remainder using parametric object model */ #else ISM_MASA_MODE_ONE_OBJ, /* MASA ISM mode when one object is encoded separarately */ #endif ISM_MASA_MODE_DISC /* MASA ISM mode when all objects are encoded separarately */ #endif } ISM_MODE; Loading Loading @@ -624,7 +629,11 @@ enum IND_STEREO_DFT_SIDEGAIN_FLAG, IND_STEREO_DFT_SIDEGAINS, #ifdef OMASA_UPDATES IND_STEREO_DFT_ITD_MODE = IND_STEREO_DFT_SIDEGAINS + 4 * STEREO_DFT_BAND_MAX + 120, #else IND_STEREO_DFT_ITD_MODE = IND_STEREO_DFT_SIDEGAINS + 4 * STEREO_DFT_BAND_MAX + 72, #endif IND_STEREO_DFT_ITD_HUFF, IND_STEREO_DFT_ITD_NEG, Loading lib_com/ivas_ism_config.c +7 −15 Original line number Diff line number Diff line Loading @@ -50,7 +50,7 @@ #define FRMS_PER_SECOND ( 1000000000 / FRAME_SIZE_NS ) #ifndef OMASA_BRATE #ifndef MASA_AND_OBJECTS #define BRATE_ISM_INACTIVE 2450 /* CoreCoder bitrate in ISm inactive frames */ #define BITS_ISM_INACTIVE ( BRATE_ISM_INACTIVE / FRMS_PER_SECOND ) #endif Loading @@ -65,7 +65,7 @@ * Convert bit-budget to bitrate *-------------------------------------------------------------------*/ #ifdef OMASA_BRATE #ifdef MASA_AND_OBJECTS void bitbudget_to_brate( #else static void bitbudget_to_brate( Loading Loading @@ -142,7 +142,7 @@ ivas_error ivas_ism_config( } } #ifdef OMASA_BRATE #ifdef MASA_AND_OBJECTS /* decision about bitrates per channel */ if ( combined_format_flag ) { Loading Loading @@ -185,17 +185,7 @@ ivas_error ivas_ism_config( /* count ISm common signaling bits */ if ( hIsmMeta != NULL ) { #ifdef MASA_AND_OBJECTS nb_bits_metadata[0] += n_ISms * ISM_METADATA_FLAG_BITS; if ( combined_format_flag == 0 ) { /* the bits for writing the number of objects are counted here for pure ISM modes */ nb_bits_metadata[0] += num_obj; } #else nb_bits_metadata[0] += n_ISms * ISM_METADATA_FLAG_BITS + num_obj; #endif for ( ch = 0; ch < n_ISms; ch++ ) { if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) Loading Loading @@ -362,7 +352,7 @@ ivas_error ivas_ism_config( } } #ifdef OMASA_BRATE #ifdef MASA_AND_OBJECTS if ( combined_format_flag == 1 ) { if ( diff > 0 ) Loading Loading @@ -390,12 +380,13 @@ ivas_error ivas_ism_config( bitbudget_to_brate( bits_CoreCoder, total_brate, n_ISms ); } #ifdef DEBUGGING if ( nb_bits_metadata != NULL ) { int32_t tmpL; tmpL = sum_l( total_brate, n_ISms ) + bits_side * FRMS_PER_SECOND; #ifdef OMASA_BRATE #ifdef MASA_AND_OBJECTS if ( ism_total_brate != tmpL ) #else if ( sum_l( element_brate, n_ISms ) != tmpL ) Loading @@ -403,6 +394,7 @@ ivas_error ivas_ism_config( { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "\nError: Mismatch in ISm bit-budget distribution. Exiting!\n" ); } } #endif Loading lib_com/ivas_masa_com.c +13 −2 Original line number Diff line number Diff line Loading @@ -96,7 +96,11 @@ void ivas_masa_set_elements( if ( ivas_total_brate > MIN_BRATE_MDCT_STEREO ) { *element_mode = IVAS_CPE_MDCT; #ifdef OMASA_UPDATES if ( ( ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) && ( ivas_total_brate - ism_total_brate < MIN_BRATE_MDCT_STEREO ) ) #else if ( ( ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_ONE_OBJ ) && ( ivas_total_brate - ism_total_brate < MIN_BRATE_MDCT_STEREO ) ) #endif { *element_mode = IVAS_CPE_DFT; } Loading @@ -115,7 +119,11 @@ void ivas_masa_set_elements( } hQMetaData->bits_frame_nominal = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC ); #ifdef MASA_AND_OBJECTS #ifdef OMASA_UPDATES if ( ivas_format == MASA_ISM_FORMAT && ( ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || ism_mode == ISM_MASA_MODE_DISC ) ) #else if ( ivas_format == MASA_ISM_FORMAT && ( ism_mode == ISM_MASA_MODE_ONE_OBJ || ism_mode == ISM_MASA_MODE_DISC ) ) #endif { hQMetaData->bits_frame_nominal -= (int16_t) ( ism_total_brate / FRAMES_PER_SEC ); } Loading Loading @@ -494,12 +502,11 @@ void reconstruct_ism_ratios( } q_energy_ratio_ism[nchan_ism - 1] = 1.0f - sum; #ifdef REDUCE_OMASA_META_BITS if ( q_energy_ratio_ism[nchan_ism - 1] < 0 ) { q_energy_ratio_ism[nchan_ism - 1] = 0.0f; } #endif return; } Loading Loading @@ -605,7 +612,11 @@ int32_t calculate_cpe_brate_MASA_ISM( k++; } #ifdef OMASA_UPDATES if ( ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) #else if ( ism_mode == ISM_MASA_MODE_ONE_OBJ ) #endif { cpe_brate = ivas_total_brate - sep_object_brate[k - 2][0]; /* take data from the first column */ } Loading lib_com/ivas_omasa_com.c +80 −27 Original line number Diff line number Diff line Loading @@ -35,16 +35,13 @@ #include "ivas_cnst.h" #include "ivas_prot.h" #include "prot.h" #ifdef REDUCE_OMASA_META_BITS #include "ivas_rom_com.h" #include <math.h> #endif #ifdef DEBUGGING #include "debug.h" #endif #ifdef MASA_AND_OBJECTS #ifdef OMASA_BRATE /*--------------------------------------------------------------- * Local constants *---------------------------------------------------------------*/ Loading @@ -61,8 +58,7 @@ #define GAMMA_ISM_MEDIUM_IMP3 1.15f #define GAMMA_ISM_HIGH_IMP3 1.3f #ifdef TUNING_DISC_3_4obj #ifdef FIX_4OBJ_128 #ifdef OMASA_UPDATES #define GAMMA_ISM_LOW_IMP4 0.8f #define GAMMA_ISM_MEDIUM_IMP4 1.0f #define GAMMA_ISM_HIGH_IMP4 1.2f Loading @@ -71,8 +67,8 @@ #define GAMMA_ISM_MEDIUM_IMP4 0.8f #define GAMMA_ISM_HIGH_IMP4 1.0f #endif #endif #endif /*--------------------------------------------------------------- * ivas_omasa_ism_mode_select() Loading Loading @@ -108,7 +104,11 @@ ISM_MODE ivas_omasa_ism_mode_select( } else if ( ivas_total_brate >= IVAS_32k ) { #ifdef OMASA_UPDATES ism_mode = ISM_MASA_MODE_PARAM_ONE_OBJ; #else ism_mode = ISM_MASA_MODE_ONE_OBJ; #endif } else { Loading @@ -116,36 +116,49 @@ ISM_MODE ivas_omasa_ism_mode_select( } break; case 3: #ifdef TUNING_DISC_3_4obj if ( ivas_total_brate >= IVAS_96k ) #else if ( ivas_total_brate >= IVAS_128k ) #endif { ism_mode = ISM_MASA_MODE_DISC; } else if ( ivas_total_brate >= IVAS_64k ) { #ifdef OMASA_UPDATES ism_mode = ISM_MASA_MODE_PARAM_ONE_OBJ; #else ism_mode = ISM_MASA_MODE_ONE_OBJ; #endif } #ifdef OMASA_UPDATES else if ( ivas_total_brate >= IVAS_32k ) { ism_mode = ISM_MASA_MODE_MASA_ONE_OBJ; } #else else if ( ivas_total_brate >= IVAS_48k ) { ism_mode = ISM_MASA_MODE_PARAM; } #endif else { ism_mode = ISM_MODE_NONE; } break; case 4: #ifdef TUNING_DISC_3_4obj if ( ivas_total_brate >= IVAS_128k ) #else if ( ivas_total_brate >= IVAS_160k ) #endif { ism_mode = ISM_MASA_MODE_DISC; } #ifdef OMASA_UPDATES else if ( ivas_total_brate >= IVAS_64k ) { ism_mode = ISM_MASA_MODE_PARAM_ONE_OBJ; } else if ( ivas_total_brate >= IVAS_32k ) { ism_mode = ISM_MASA_MODE_MASA_ONE_OBJ; } #else else if ( ivas_total_brate >= IVAS_64k ) { ism_mode = ISM_MASA_MODE_ONE_OBJ; Loading @@ -154,6 +167,7 @@ ISM_MODE ivas_omasa_ism_mode_select( { ism_mode = ISM_MASA_MODE_PARAM; } #endif else { ism_mode = ISM_MODE_NONE; Loading @@ -165,7 +179,7 @@ ISM_MODE ivas_omasa_ism_mode_select( } #ifdef OMASA_BRATE /*--------------------------------------------------------------- * ivas_interformat_brate() * Loading @@ -178,7 +192,7 @@ int32_t ivas_interformat_brate( const int16_t nchan_ism, /* i : number of ISM channels */ const int32_t element_brate, /* i : element bitrate */ const int16_t ism_imp /* i : ISM importance flag */ #ifdef FIX_4OBJ_128 #ifdef OMASA_UPDATES , const int16_t limit_flag /* i : flag to limit the bitrate increase */ #endif Loading @@ -195,17 +209,16 @@ int32_t ivas_interformat_brate( } else { #ifdef TUNING_DISC_3_4obj if ( ism_mode == ISM_MASA_MODE_DISC && ( ( nchan_ism == 4 && element_brate == 24000 ) || ( nchan_ism == 3 && element_brate == 20000 ) ) ) /* this condition corresponds to the ivas_total_brate = 96000 and 3 objects */ if ( ism_mode == ISM_MASA_MODE_DISC && ( ( nchan_ism == 4 && element_brate == 24000 ) || ( nchan_ism == 3 && element_brate <= 24000 ) || ( nchan_ism == 2 && element_brate <= 11000 ) ) ) /* for border case in DISC mode */ { #ifdef FIX_4OBJ_128 if ( limit_flag && ( nchan_ism == 4 && element_brate == 24000 ) ) #ifdef OMASA_UPDATES if ( (limit_flag == 1) && ( ( nchan_ism == 4 && element_brate == 24000 ) || ( nchan_ism == 3 && element_brate == 20000 ) || ( nchan_ism == 2 && element_brate <= 11000 ) ) ) { return element_brate; } #endif if ( ism_imp == ISM_LOW_IMP ) { nBits = (int16_t) ( nBits * GAMMA_ISM_LOW_IMP4 ); Loading @@ -213,15 +226,26 @@ int32_t ivas_interformat_brate( else if ( ism_imp == ISM_MEDIUM_IMP ) { nBits = (int16_t) ( nBits * GAMMA_ISM_MEDIUM_IMP4 ); if ( limit_flag == -1 ) { nBits = (int16_t) ( nBits * GAMMA_ISM_HIGH_IMP4 ); } } else /* ISM_HIGH_IMP */ { nBits = (int16_t) ( nBits * GAMMA_ISM_HIGH_IMP4 ); if ( limit_flag == -1 ) { nBits = (int16_t) ( nBits * GAMMA_ISM_HIGH_IMP4 ); } } } else #endif #ifdef OMASA_UPDATES if ( ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || #else if ( ism_mode == ISM_MASA_MODE_ONE_OBJ || #endif ( ism_mode == ISM_MASA_MODE_DISC && element_brate == 9600 ) /* this condition corresponds to the ivas_total_brate = 24400 and 1 object */ ) { Loading Loading @@ -319,9 +343,8 @@ void ivas_combined_format_brate_sanity( return; } #endif #ifdef REDUCE_OMASA_META_BITS /*--------------------------------------------------------------- * bits_index_ism_ratio() * Loading Loading @@ -414,7 +437,7 @@ void calculate_nbits_meta( priority[obj] = max_p; } } bits_ism[obj] = bits_direction_masa[0] - (int16_t) ( ( 1 - ( (int16_t) ( priority[obj] * 1000.0f ) ) * 0.001f ) * 7 ); bits_ism[obj] = bits_direction_masa[0] - (int16_t) ( ( 1 - ( (int16_t) ( priority[obj] * 1000.0f ) ) * 0.001f ) * 6 ); } return; Loading Loading @@ -463,5 +486,35 @@ void ivas_get_stereo_panning_gains( return; } int16_t calculate_brate_limit_flag(int16_t * ism_imp, int16_t num_obj) { int16_t n; int16_t brate_limit_flag; int16_t nzeros; brate_limit_flag = 0; nzeros = 0; for ( n = 0; n < num_obj; n++ ) { brate_limit_flag += ism_imp[n]; if ( ism_imp[n] == 0 ) { nzeros++; } } if ( brate_limit_flag >= (int16_t) ( num_obj * 2.5f ) ) { brate_limit_flag = 1; } else { if ( nzeros / (float) num_obj >= 0.5f ) { brate_limit_flag = -1; /* there is no limitation, on the contrary */ } } return brate_limit_flag; } #endif #endif Loading
lib_com/bitstream.c +4 −0 Original line number Diff line number Diff line Loading @@ -1984,7 +1984,11 @@ ivas_error preview_indices( { st_ivas->ism_mode = ivas_omasa_ism_mode_select( total_brate, st_ivas->nchan_ism ); #ifdef OMASA_UPDATES if ( st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || st_ivas->ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) #else if ( st_ivas->ism_mode == ISM_MASA_MODE_ONE_OBJ ) #endif { st_ivas->nchan_transport = 0; } Loading
lib_com/ivas_cnst.h +11 −2 Original line number Diff line number Diff line Loading @@ -307,7 +307,7 @@ typedef enum #define ISM_METADATA_VAD_FLAG_BITS 1 #define ISM_METADATA_FLAG_BITS 2 #ifdef OMASA_BRATE #ifdef MASA_AND_OBJECTS #define ISM_INACTIVE_IMP 0 /* == ISM_NO_META */ #endif #define ISM_NO_META 0 Loading @@ -315,7 +315,7 @@ typedef enum #define ISM_MEDIUM_IMP 2 #define ISM_HIGH_IMP 3 #ifdef OMASA_BRATE #ifdef MASA_AND_OBJECTS #define BRATE_ISM_INACTIVE 2450 /* CoreCoder bitrate in ISM no meta / inactive frames */ #define BITS_ISM_INACTIVE ( BRATE_ISM_INACTIVE / FRAMES_PER_SEC ) #endif Loading Loading @@ -361,7 +361,12 @@ typedef enum #ifdef MASA_AND_OBJECTS , ISM_MASA_MODE_PARAM, /* parametric ISM mode for combined MASA ISM format */ #ifdef OMASA_UPDATES ISM_MASA_MODE_MASA_ONE_OBJ, /* MASA ISM mode when one object is encoded separately and remainder using MASA parameters */ ISM_MASA_MODE_PARAM_ONE_OBJ, /* MASA ISM mode when one object is encoded separately and remainder using parametric object model */ #else ISM_MASA_MODE_ONE_OBJ, /* MASA ISM mode when one object is encoded separarately */ #endif ISM_MASA_MODE_DISC /* MASA ISM mode when all objects are encoded separarately */ #endif } ISM_MODE; Loading Loading @@ -624,7 +629,11 @@ enum IND_STEREO_DFT_SIDEGAIN_FLAG, IND_STEREO_DFT_SIDEGAINS, #ifdef OMASA_UPDATES IND_STEREO_DFT_ITD_MODE = IND_STEREO_DFT_SIDEGAINS + 4 * STEREO_DFT_BAND_MAX + 120, #else IND_STEREO_DFT_ITD_MODE = IND_STEREO_DFT_SIDEGAINS + 4 * STEREO_DFT_BAND_MAX + 72, #endif IND_STEREO_DFT_ITD_HUFF, IND_STEREO_DFT_ITD_NEG, Loading
lib_com/ivas_ism_config.c +7 −15 Original line number Diff line number Diff line Loading @@ -50,7 +50,7 @@ #define FRMS_PER_SECOND ( 1000000000 / FRAME_SIZE_NS ) #ifndef OMASA_BRATE #ifndef MASA_AND_OBJECTS #define BRATE_ISM_INACTIVE 2450 /* CoreCoder bitrate in ISm inactive frames */ #define BITS_ISM_INACTIVE ( BRATE_ISM_INACTIVE / FRMS_PER_SECOND ) #endif Loading @@ -65,7 +65,7 @@ * Convert bit-budget to bitrate *-------------------------------------------------------------------*/ #ifdef OMASA_BRATE #ifdef MASA_AND_OBJECTS void bitbudget_to_brate( #else static void bitbudget_to_brate( Loading Loading @@ -142,7 +142,7 @@ ivas_error ivas_ism_config( } } #ifdef OMASA_BRATE #ifdef MASA_AND_OBJECTS /* decision about bitrates per channel */ if ( combined_format_flag ) { Loading Loading @@ -185,17 +185,7 @@ ivas_error ivas_ism_config( /* count ISm common signaling bits */ if ( hIsmMeta != NULL ) { #ifdef MASA_AND_OBJECTS nb_bits_metadata[0] += n_ISms * ISM_METADATA_FLAG_BITS; if ( combined_format_flag == 0 ) { /* the bits for writing the number of objects are counted here for pure ISM modes */ nb_bits_metadata[0] += num_obj; } #else nb_bits_metadata[0] += n_ISms * ISM_METADATA_FLAG_BITS + num_obj; #endif for ( ch = 0; ch < n_ISms; ch++ ) { if ( hIsmMeta[ch]->ism_metadata_flag == 0 ) Loading Loading @@ -362,7 +352,7 @@ ivas_error ivas_ism_config( } } #ifdef OMASA_BRATE #ifdef MASA_AND_OBJECTS if ( combined_format_flag == 1 ) { if ( diff > 0 ) Loading Loading @@ -390,12 +380,13 @@ ivas_error ivas_ism_config( bitbudget_to_brate( bits_CoreCoder, total_brate, n_ISms ); } #ifdef DEBUGGING if ( nb_bits_metadata != NULL ) { int32_t tmpL; tmpL = sum_l( total_brate, n_ISms ) + bits_side * FRMS_PER_SECOND; #ifdef OMASA_BRATE #ifdef MASA_AND_OBJECTS if ( ism_total_brate != tmpL ) #else if ( sum_l( element_brate, n_ISms ) != tmpL ) Loading @@ -403,6 +394,7 @@ ivas_error ivas_ism_config( { return IVAS_ERROR( IVAS_ERR_INTERNAL_FATAL, "\nError: Mismatch in ISm bit-budget distribution. Exiting!\n" ); } } #endif Loading
lib_com/ivas_masa_com.c +13 −2 Original line number Diff line number Diff line Loading @@ -96,7 +96,11 @@ void ivas_masa_set_elements( if ( ivas_total_brate > MIN_BRATE_MDCT_STEREO ) { *element_mode = IVAS_CPE_MDCT; #ifdef OMASA_UPDATES if ( ( ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) && ( ivas_total_brate - ism_total_brate < MIN_BRATE_MDCT_STEREO ) ) #else if ( ( ism_mode == ISM_MASA_MODE_DISC || ism_mode == ISM_MASA_MODE_ONE_OBJ ) && ( ivas_total_brate - ism_total_brate < MIN_BRATE_MDCT_STEREO ) ) #endif { *element_mode = IVAS_CPE_DFT; } Loading @@ -115,7 +119,11 @@ void ivas_masa_set_elements( } hQMetaData->bits_frame_nominal = (int16_t) ( ivas_total_brate / FRAMES_PER_SEC ); #ifdef MASA_AND_OBJECTS #ifdef OMASA_UPDATES if ( ivas_format == MASA_ISM_FORMAT && ( ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ || ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || ism_mode == ISM_MASA_MODE_DISC ) ) #else if ( ivas_format == MASA_ISM_FORMAT && ( ism_mode == ISM_MASA_MODE_ONE_OBJ || ism_mode == ISM_MASA_MODE_DISC ) ) #endif { hQMetaData->bits_frame_nominal -= (int16_t) ( ism_total_brate / FRAMES_PER_SEC ); } Loading Loading @@ -494,12 +502,11 @@ void reconstruct_ism_ratios( } q_energy_ratio_ism[nchan_ism - 1] = 1.0f - sum; #ifdef REDUCE_OMASA_META_BITS if ( q_energy_ratio_ism[nchan_ism - 1] < 0 ) { q_energy_ratio_ism[nchan_ism - 1] = 0.0f; } #endif return; } Loading Loading @@ -605,7 +612,11 @@ int32_t calculate_cpe_brate_MASA_ISM( k++; } #ifdef OMASA_UPDATES if ( ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || ism_mode == ISM_MASA_MODE_MASA_ONE_OBJ ) #else if ( ism_mode == ISM_MASA_MODE_ONE_OBJ ) #endif { cpe_brate = ivas_total_brate - sep_object_brate[k - 2][0]; /* take data from the first column */ } Loading
lib_com/ivas_omasa_com.c +80 −27 Original line number Diff line number Diff line Loading @@ -35,16 +35,13 @@ #include "ivas_cnst.h" #include "ivas_prot.h" #include "prot.h" #ifdef REDUCE_OMASA_META_BITS #include "ivas_rom_com.h" #include <math.h> #endif #ifdef DEBUGGING #include "debug.h" #endif #ifdef MASA_AND_OBJECTS #ifdef OMASA_BRATE /*--------------------------------------------------------------- * Local constants *---------------------------------------------------------------*/ Loading @@ -61,8 +58,7 @@ #define GAMMA_ISM_MEDIUM_IMP3 1.15f #define GAMMA_ISM_HIGH_IMP3 1.3f #ifdef TUNING_DISC_3_4obj #ifdef FIX_4OBJ_128 #ifdef OMASA_UPDATES #define GAMMA_ISM_LOW_IMP4 0.8f #define GAMMA_ISM_MEDIUM_IMP4 1.0f #define GAMMA_ISM_HIGH_IMP4 1.2f Loading @@ -71,8 +67,8 @@ #define GAMMA_ISM_MEDIUM_IMP4 0.8f #define GAMMA_ISM_HIGH_IMP4 1.0f #endif #endif #endif /*--------------------------------------------------------------- * ivas_omasa_ism_mode_select() Loading Loading @@ -108,7 +104,11 @@ ISM_MODE ivas_omasa_ism_mode_select( } else if ( ivas_total_brate >= IVAS_32k ) { #ifdef OMASA_UPDATES ism_mode = ISM_MASA_MODE_PARAM_ONE_OBJ; #else ism_mode = ISM_MASA_MODE_ONE_OBJ; #endif } else { Loading @@ -116,36 +116,49 @@ ISM_MODE ivas_omasa_ism_mode_select( } break; case 3: #ifdef TUNING_DISC_3_4obj if ( ivas_total_brate >= IVAS_96k ) #else if ( ivas_total_brate >= IVAS_128k ) #endif { ism_mode = ISM_MASA_MODE_DISC; } else if ( ivas_total_brate >= IVAS_64k ) { #ifdef OMASA_UPDATES ism_mode = ISM_MASA_MODE_PARAM_ONE_OBJ; #else ism_mode = ISM_MASA_MODE_ONE_OBJ; #endif } #ifdef OMASA_UPDATES else if ( ivas_total_brate >= IVAS_32k ) { ism_mode = ISM_MASA_MODE_MASA_ONE_OBJ; } #else else if ( ivas_total_brate >= IVAS_48k ) { ism_mode = ISM_MASA_MODE_PARAM; } #endif else { ism_mode = ISM_MODE_NONE; } break; case 4: #ifdef TUNING_DISC_3_4obj if ( ivas_total_brate >= IVAS_128k ) #else if ( ivas_total_brate >= IVAS_160k ) #endif { ism_mode = ISM_MASA_MODE_DISC; } #ifdef OMASA_UPDATES else if ( ivas_total_brate >= IVAS_64k ) { ism_mode = ISM_MASA_MODE_PARAM_ONE_OBJ; } else if ( ivas_total_brate >= IVAS_32k ) { ism_mode = ISM_MASA_MODE_MASA_ONE_OBJ; } #else else if ( ivas_total_brate >= IVAS_64k ) { ism_mode = ISM_MASA_MODE_ONE_OBJ; Loading @@ -154,6 +167,7 @@ ISM_MODE ivas_omasa_ism_mode_select( { ism_mode = ISM_MASA_MODE_PARAM; } #endif else { ism_mode = ISM_MODE_NONE; Loading @@ -165,7 +179,7 @@ ISM_MODE ivas_omasa_ism_mode_select( } #ifdef OMASA_BRATE /*--------------------------------------------------------------- * ivas_interformat_brate() * Loading @@ -178,7 +192,7 @@ int32_t ivas_interformat_brate( const int16_t nchan_ism, /* i : number of ISM channels */ const int32_t element_brate, /* i : element bitrate */ const int16_t ism_imp /* i : ISM importance flag */ #ifdef FIX_4OBJ_128 #ifdef OMASA_UPDATES , const int16_t limit_flag /* i : flag to limit the bitrate increase */ #endif Loading @@ -195,17 +209,16 @@ int32_t ivas_interformat_brate( } else { #ifdef TUNING_DISC_3_4obj if ( ism_mode == ISM_MASA_MODE_DISC && ( ( nchan_ism == 4 && element_brate == 24000 ) || ( nchan_ism == 3 && element_brate == 20000 ) ) ) /* this condition corresponds to the ivas_total_brate = 96000 and 3 objects */ if ( ism_mode == ISM_MASA_MODE_DISC && ( ( nchan_ism == 4 && element_brate == 24000 ) || ( nchan_ism == 3 && element_brate <= 24000 ) || ( nchan_ism == 2 && element_brate <= 11000 ) ) ) /* for border case in DISC mode */ { #ifdef FIX_4OBJ_128 if ( limit_flag && ( nchan_ism == 4 && element_brate == 24000 ) ) #ifdef OMASA_UPDATES if ( (limit_flag == 1) && ( ( nchan_ism == 4 && element_brate == 24000 ) || ( nchan_ism == 3 && element_brate == 20000 ) || ( nchan_ism == 2 && element_brate <= 11000 ) ) ) { return element_brate; } #endif if ( ism_imp == ISM_LOW_IMP ) { nBits = (int16_t) ( nBits * GAMMA_ISM_LOW_IMP4 ); Loading @@ -213,15 +226,26 @@ int32_t ivas_interformat_brate( else if ( ism_imp == ISM_MEDIUM_IMP ) { nBits = (int16_t) ( nBits * GAMMA_ISM_MEDIUM_IMP4 ); if ( limit_flag == -1 ) { nBits = (int16_t) ( nBits * GAMMA_ISM_HIGH_IMP4 ); } } else /* ISM_HIGH_IMP */ { nBits = (int16_t) ( nBits * GAMMA_ISM_HIGH_IMP4 ); if ( limit_flag == -1 ) { nBits = (int16_t) ( nBits * GAMMA_ISM_HIGH_IMP4 ); } } } else #endif #ifdef OMASA_UPDATES if ( ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || #else if ( ism_mode == ISM_MASA_MODE_ONE_OBJ || #endif ( ism_mode == ISM_MASA_MODE_DISC && element_brate == 9600 ) /* this condition corresponds to the ivas_total_brate = 24400 and 1 object */ ) { Loading Loading @@ -319,9 +343,8 @@ void ivas_combined_format_brate_sanity( return; } #endif #ifdef REDUCE_OMASA_META_BITS /*--------------------------------------------------------------- * bits_index_ism_ratio() * Loading Loading @@ -414,7 +437,7 @@ void calculate_nbits_meta( priority[obj] = max_p; } } bits_ism[obj] = bits_direction_masa[0] - (int16_t) ( ( 1 - ( (int16_t) ( priority[obj] * 1000.0f ) ) * 0.001f ) * 7 ); bits_ism[obj] = bits_direction_masa[0] - (int16_t) ( ( 1 - ( (int16_t) ( priority[obj] * 1000.0f ) ) * 0.001f ) * 6 ); } return; Loading Loading @@ -463,5 +486,35 @@ void ivas_get_stereo_panning_gains( return; } int16_t calculate_brate_limit_flag(int16_t * ism_imp, int16_t num_obj) { int16_t n; int16_t brate_limit_flag; int16_t nzeros; brate_limit_flag = 0; nzeros = 0; for ( n = 0; n < num_obj; n++ ) { brate_limit_flag += ism_imp[n]; if ( ism_imp[n] == 0 ) { nzeros++; } } if ( brate_limit_flag >= (int16_t) ( num_obj * 2.5f ) ) { brate_limit_flag = 1; } else { if ( nzeros / (float) num_obj >= 0.5f ) { brate_limit_flag = -1; /* there is no limitation, on the contrary */ } } return brate_limit_flag; } #endif #endif