Loading lib_dec/lib_dec.c +321 −0 Original line number Diff line number Diff line Loading @@ -1213,14 +1213,17 @@ ivas_error IVAS_DEC_GetEditableParameters( ) { int16_t dirac_read_idx, obj; #ifdef NONBE_1217_INIT_OBJ_EDIT Decoder_Struct *st_ivas; ISM_MODE ism_mode; #endif if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasEditableParameters == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } #ifdef NONBE_1217_INIT_OBJ_EDIT st_ivas = hIvasDec->st_ivas; ism_mode = st_ivas->ism_mode; Loading Loading @@ -1345,6 +1348,114 @@ ivas_error IVAS_DEC_GetEditableParameters( #endif #endif } #else if ( !( hIvasDec->st_ivas->ivas_format == ISM_FORMAT || hIvasDec->st_ivas->ivas_format == SBA_ISM_FORMAT || hIvasDec->st_ivas->ivas_format == MASA_ISM_FORMAT || ( hIvasDec->st_ivas->ivas_format == MASA_FORMAT && hIvasDec->st_ivas->nchan_ism > 0 ) ) ) { return IVAS_ERROR( IVAS_ERR_OBJECTS_EDITING_NOT_SUPPORTED, "Object editing is not supported in this operation mode." ); } if ( hIvasEditableParameters == NULL || hIvasDec == NULL || hIvasDec->st_ivas == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } hIvasEditableParameters->gain_bed = 1.0f; hIvasEditableParameters->num_obj = hIvasDec->st_ivas->nchan_ism; if ( hIvasDec->st_ivas->ivas_format == ISM_FORMAT || hIvasDec->st_ivas->ivas_format == SBA_ISM_FORMAT ) { if ( hIvasDec->st_ivas->ism_mode == ISM_MODE_DISC || hIvasDec->st_ivas->ism_mode == ISM_SBA_MODE_DISC ) { for ( obj = 0; obj < hIvasEditableParameters->num_obj; obj++ ) { hIvasEditableParameters->ism_metadata[obj].azimuth = hIvasDec->st_ivas->hIsmMetaData[obj]->azimuth; hIvasEditableParameters->ism_metadata[obj].elevation = hIvasDec->st_ivas->hIsmMetaData[obj]->elevation; hIvasEditableParameters->ism_metadata[obj].yaw = hIvasDec->st_ivas->hIsmMetaData[obj]->yaw; hIvasEditableParameters->ism_metadata[obj].pitch = hIvasDec->st_ivas->hIsmMetaData[obj]->pitch; hIvasEditableParameters->ism_metadata[obj].radius = hIvasDec->st_ivas->hIsmMetaData[obj]->radius; hIvasEditableParameters->ism_metadata[obj].gain = hIvasDec->st_ivas->hIsmMetaData[obj]->edited_gain; hIvasEditableParameters->ism_metadata[obj].non_diegetic_flag = hIvasDec->st_ivas->hIsmMetaData[obj]->non_diegetic_flag; } if ( hIvasDec->st_ivas->ism_mode == ISM_SBA_MODE_DISC ) { hIvasEditableParameters->gain_bed = 1.0f; } } else if ( hIvasDec->st_ivas->ism_mode == ISM_MODE_PARAM ) { for ( obj = 0; obj < hIvasEditableParameters->num_obj; obj++ ) { hIvasEditableParameters->ism_metadata[obj].azimuth = hIvasDec->st_ivas->hParamIsmDec->azimuth_values[obj]; hIvasEditableParameters->ism_metadata[obj].elevation = hIvasDec->st_ivas->hParamIsmDec->elevation_values[obj]; hIvasEditableParameters->ism_metadata[obj].yaw = 0.0f; hIvasEditableParameters->ism_metadata[obj].pitch = 0.0f; hIvasEditableParameters->ism_metadata[obj].radius = 0.0f; hIvasEditableParameters->ism_metadata[obj].gain = 1.0f; hIvasEditableParameters->ism_metadata[obj].non_diegetic_flag = 0; } } else if ( hIvasDec->st_ivas->ism_mode == ISM_MODE_NONE ) { hIvasEditableParameters->num_obj = 0; } #ifdef DEBUGGING else { assert( 0 && "This should never happen!" ); } #endif } else if ( hIvasDec->st_ivas->ivas_format == MASA_ISM_FORMAT && ( hIvasDec->st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || hIvasDec->st_ivas->ism_mode == ISM_MASA_MODE_DISC ) ) { /* object editing possible only in two highest OMASA modes */ if ( hIvasDec->st_ivas->ism_mode == ISM_MASA_MODE_DISC ) { for ( obj = 0; obj < hIvasEditableParameters->num_obj; obj++ ) { hIvasEditableParameters->ism_metadata[obj].azimuth = hIvasDec->st_ivas->hIsmMetaData[obj]->azimuth; hIvasEditableParameters->ism_metadata[obj].elevation = hIvasDec->st_ivas->hIsmMetaData[obj]->elevation; hIvasEditableParameters->ism_metadata[obj].yaw = hIvasDec->st_ivas->hIsmMetaData[obj]->yaw; hIvasEditableParameters->ism_metadata[obj].pitch = hIvasDec->st_ivas->hIsmMetaData[obj]->pitch; hIvasEditableParameters->ism_metadata[obj].radius = hIvasDec->st_ivas->hIsmMetaData[obj]->radius; /* reset the otherwise unused "gain" field for the object */ hIvasDec->st_ivas->hIsmMetaData[obj]->edited_gain = 1.0f; hIvasEditableParameters->ism_metadata[obj].gain = hIvasDec->st_ivas->hIsmMetaData[obj]->edited_gain; hIvasEditableParameters->ism_metadata[obj].non_diegetic_flag = hIvasDec->st_ivas->hIsmMetaData[obj]->non_diegetic_flag; } } else { /* Handle MONO output */ if ( hIvasDec->st_ivas->renderer_type != RENDERER_MONO_DOWNMIX ) { dirac_read_idx = hIvasDec->st_ivas->hSpatParamRendCom->render_to_md_map[hIvasDec->st_ivas->hSpatParamRendCom->subframes_rendered]; } else { dirac_read_idx = 0; } for ( obj = 0; obj < hIvasEditableParameters->num_obj; obj++ ) { hIvasEditableParameters->ism_metadata[obj].azimuth = hIvasDec->st_ivas->hMasaIsmData->azimuth_ism[obj][dirac_read_idx]; hIvasEditableParameters->ism_metadata[obj].elevation = hIvasDec->st_ivas->hMasaIsmData->elevation_ism[obj][dirac_read_idx]; hIvasEditableParameters->ism_metadata[obj].yaw = hIvasDec->st_ivas->hIsmMetaData[obj]->yaw; hIvasEditableParameters->ism_metadata[obj].pitch = hIvasDec->st_ivas->hIsmMetaData[obj]->pitch; hIvasEditableParameters->ism_metadata[obj].radius = hIvasDec->st_ivas->hIsmMetaData[obj]->radius; /* reset the otherwise unused "gain" field for the object */ hIvasDec->st_ivas->hIsmMetaData[obj]->edited_gain = 1.0f; hIvasEditableParameters->ism_metadata[obj].gain = hIvasDec->st_ivas->hIsmMetaData[obj]->edited_gain; hIvasEditableParameters->ism_metadata[obj].non_diegetic_flag = hIvasDec->st_ivas->hIsmMetaData[obj]->non_diegetic_flag; } } } #endif return IVAS_ERR_OK; } Loading @@ -1362,6 +1473,7 @@ ivas_error IVAS_DEC_SetEditableParameters( ) { int16_t dirac_read_idx, obj; #ifdef NONBE_1217_INIT_OBJ_EDIT Decoder_Struct *st_ivas; ISM_MODE ism_mode; Loading Loading @@ -1577,6 +1689,215 @@ ivas_error IVAS_DEC_SetEditableParameters( st_ivas->hMasaIsmData->masa_gain_is_edited = 0u; } } #else if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } if ( !( hIvasDec->st_ivas->ivas_format == ISM_FORMAT || hIvasDec->st_ivas->ivas_format == SBA_ISM_FORMAT || hIvasDec->st_ivas->ivas_format == MASA_ISM_FORMAT || ( hIvasDec->st_ivas->ivas_format == MASA_FORMAT && hIvasDec->st_ivas->nchan_ism > 0 ) ) ) { return IVAS_ERROR( IVAS_ERR_OBJECTS_EDITING_NOT_SUPPORTED, "Object editing no supported in this operation mode." ); } if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } #ifdef DEBUGGING assert( hIvasEditableParameters.num_obj == hIvasDec->st_ivas->nchan_ism ); #endif if ( hIvasDec->st_ivas->ivas_format == ISM_FORMAT || hIvasDec->st_ivas->ivas_format == SBA_ISM_FORMAT ) { if ( hIvasDec->st_ivas->ism_mode == ISM_MODE_DISC || hIvasDec->st_ivas->ism_mode == ISM_SBA_MODE_DISC ) { for ( obj = 0; obj < hIvasEditableParameters.num_obj; obj++ ) { hIvasDec->st_ivas->hIsmMetaData[obj]->edited_azimuth = hIvasEditableParameters.ism_metadata[obj].azimuth; hIvasDec->st_ivas->hIsmMetaData[obj]->edited_elevation = hIvasEditableParameters.ism_metadata[obj].elevation; hIvasDec->st_ivas->hIsmMetaData[obj]->edited_radius = hIvasEditableParameters.ism_metadata[obj].radius; hIvasDec->st_ivas->hIsmMetaData[obj]->edited_gain = hIvasEditableParameters.ism_metadata[obj].gain; hIvasDec->st_ivas->hIsmMetaData[obj]->edited_yaw = hIvasEditableParameters.ism_metadata[obj].yaw; hIvasDec->st_ivas->hIsmMetaData[obj]->edited_pitch = hIvasEditableParameters.ism_metadata[obj].pitch; hIvasDec->st_ivas->hIsmMetaData[obj]->non_diegetic_flag = hIvasEditableParameters.ism_metadata[obj].non_diegetic_flag; } if ( hIvasDec->st_ivas->ism_mode == ISM_SBA_MODE_DISC ) { hIvasDec->st_ivas->hSbaIsmData->gain_bed = hIvasEditableParameters.gain_bed; } } else if ( hIvasDec->st_ivas->ism_mode == ISM_MODE_PARAM ) { for ( obj = 0; obj < hIvasEditableParameters.num_obj; obj++ ) { hIvasDec->st_ivas->hParamIsmDec->edited_azimuth_values[obj] = hIvasEditableParameters.ism_metadata[obj].azimuth; hIvasDec->st_ivas->hParamIsmDec->edited_elevation_values[obj] = hIvasEditableParameters.ism_metadata[obj].elevation; hIvasDec->st_ivas->hMasaIsmData->gain_ism_edited[obj] = hIvasEditableParameters.ism_metadata[obj].gain; /* Detect direction editing in Param-ISM mode */ if ( fabsf( hIvasDec->st_ivas->hParamIsmDec->azimuth_values[obj] - hIvasEditableParameters.ism_metadata[obj].azimuth ) > OMASA_AZI_EDIT_THR || fabsf( hIvasDec->st_ivas->hParamIsmDec->elevation_values[obj] - hIvasEditableParameters.ism_metadata[obj].elevation ) > OMASA_ELE_EDIT_THR ) { hIvasDec->st_ivas->hMasaIsmData->ism_dir_is_edited[obj] = 1u; } else { hIvasDec->st_ivas->hMasaIsmData->ism_dir_is_edited[obj] = 0u; } /* Detect gain editing in Param-ISM mode */ if ( fabsf( 1.0f - hIvasEditableParameters.ism_metadata[obj].gain ) > OMASA_GAIN_EDIT_THR ) { hIvasDec->st_ivas->hMasaIsmData->ism_gain_is_edited[obj] = 1u; } else { hIvasDec->st_ivas->hMasaIsmData->ism_gain_is_edited[obj] = 0u; } } /* MASA is not present with the ISM format */ hIvasDec->st_ivas->hMasaIsmData->masa_gain_is_edited = 0u; } else if ( hIvasDec->st_ivas->ism_mode == ISM_MODE_NONE ) { if ( hIvasEditableParameters.num_obj != 0 ) { return IVAS_ERR_OBJECTS_EDITING_NOT_SUPPORTED; } } else { assert( 0 && "This should never happen!" ); } } else if ( hIvasDec->st_ivas->ivas_format == MASA_ISM_FORMAT && ( hIvasDec->st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || hIvasDec->st_ivas->ism_mode == ISM_MASA_MODE_DISC ) ) { int16_t id_th; float threshold_azi, threshold_ele; for ( obj = 0; obj < hIvasEditableParameters.num_obj; obj++ ) { if ( hIvasDec->st_ivas->hMasaIsmData != NULL ) { /* copy relevant fields also to OMASA structs, but only if the value has been changed. original values are in st_ivas->hIsmMetaData */ /* first, need to convert float values to ints used internally */ int16_t new_azi, new_ele; if ( hIvasEditableParameters.ism_metadata[obj].azimuth > 0.0f ) { new_azi = (int16_t) ( hIvasEditableParameters.ism_metadata[obj].azimuth + 0.5f ); } else { new_azi = (int16_t) ( hIvasEditableParameters.ism_metadata[obj].azimuth - 0.5f ); } if ( hIvasEditableParameters.ism_metadata[obj].elevation > 0.0f ) { new_ele = (int16_t) ( hIvasEditableParameters.ism_metadata[obj].elevation + 0.5f ); } else { new_ele = (int16_t) ( hIvasEditableParameters.ism_metadata[obj].elevation - 0.5f ); } if ( hIvasDec->st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) { /* Handle MONO output */ if ( hIvasDec->st_ivas->renderer_type != RENDERER_MONO_DOWNMIX ) { dirac_read_idx = hIvasDec->st_ivas->hSpatParamRendCom->render_to_md_map[hIvasDec->st_ivas->hSpatParamRendCom->subframes_rendered]; } else { dirac_read_idx = 0; } /* determine thresholds for detecting object metadata edit for direction based on quantization resolution of the spatial direction parameters. * these depend from the number of bits used to transmit the directions, * which in turn depends from the object priority and importance: * importance -> priority -> number of bits -> elevation resolution -> elevation ring index -> azimuth resolution. * leading to elevation_resolution -> elevation threshold and azimuth resolution -> azimuth threshold */ id_th = (int16_t) ( fabsf( (float) hIvasDec->st_ivas->hMasaIsmData->elevation_ism[obj][dirac_read_idx] ) / delta_theta_masa[hIvasDec->st_ivas->hMasaIsmData->bits_ism[obj] - 3] + 0.5f ); threshold_azi = 360.0f / (float) no_phi_masa[hIvasDec->st_ivas->hMasaIsmData->bits_ism[obj] - 1][id_th]; threshold_ele = delta_theta_masa[hIvasDec->st_ivas->hMasaIsmData->bits_ism[obj] - 3]; if ( ( (float) abs( new_azi - hIvasDec->st_ivas->hMasaIsmData->azimuth_ism[obj][dirac_read_idx] ) > threshold_azi ) || ( (float) abs( new_ele - hIvasDec->st_ivas->hMasaIsmData->elevation_ism[obj][dirac_read_idx] ) > threshold_ele ) ) { /* at least one of the threshold is exceeded, so use new direction value and set editing detection flag */ hIvasDec->st_ivas->hMasaIsmData->azimuth_ism_edited[obj] = new_azi; hIvasDec->st_ivas->hMasaIsmData->elevation_ism_edited[obj] = new_ele; hIvasDec->st_ivas->hMasaIsmData->ism_dir_is_edited[obj] = 1u; } else { hIvasDec->st_ivas->hMasaIsmData->ism_dir_is_edited[obj] = 0u; } } else { /* detect editing in ISM_MASA_MODE_DISC. optionally, add quantization-resolution -based thresholds */ if ( fabsf( hIvasDec->st_ivas->hIsmMetaData[obj]->azimuth - hIvasEditableParameters.ism_metadata[obj].azimuth ) > OMASA_AZI_EDIT_THR || fabsf( hIvasDec->st_ivas->hIsmMetaData[obj]->elevation - hIvasEditableParameters.ism_metadata[obj].elevation ) > OMASA_ELE_EDIT_THR ) { hIvasDec->st_ivas->hMasaIsmData->azimuth_ism_edited[obj] = new_azi; hIvasDec->st_ivas->hMasaIsmData->elevation_ism_edited[obj] = new_ele; hIvasDec->st_ivas->hMasaIsmData->ism_dir_is_edited[obj] = 1u; } else { hIvasDec->st_ivas->hMasaIsmData->ism_dir_is_edited[obj] = 0u; } } /* compare pre-edit gain and the edited one to detect editing */ if ( fabsf( hIvasDec->st_ivas->hIsmMetaData[obj]->edited_gain - hIvasEditableParameters.ism_metadata[obj].gain ) > OMASA_GAIN_EDIT_THR ) { hIvasDec->st_ivas->hMasaIsmData->ism_gain_is_edited[obj] = 1u; hIvasDec->st_ivas->hMasaIsmData->gain_ism_edited[obj] = hIvasEditableParameters.ism_metadata[obj].gain; } else { hIvasDec->st_ivas->hMasaIsmData->ism_gain_is_edited[obj] = 0u; } } /* Copy edited values to hIsmMetaData struct */ if ( hIvasDec->st_ivas->hIsmMetaData[obj] != NULL ) { hIvasDec->st_ivas->hIsmMetaData[obj]->azimuth = hIvasEditableParameters.ism_metadata[obj].azimuth; hIvasDec->st_ivas->hIsmMetaData[obj]->elevation = hIvasEditableParameters.ism_metadata[obj].elevation; hIvasDec->st_ivas->hIsmMetaData[obj]->yaw = hIvasEditableParameters.ism_metadata[obj].yaw; hIvasDec->st_ivas->hIsmMetaData[obj]->pitch = hIvasEditableParameters.ism_metadata[obj].pitch; hIvasDec->st_ivas->hIsmMetaData[obj]->radius = hIvasEditableParameters.ism_metadata[obj].radius; hIvasDec->st_ivas->hIsmMetaData[obj]->edited_gain = hIvasEditableParameters.ism_metadata[obj].gain; hIvasDec->st_ivas->hIsmMetaData[obj]->non_diegetic_flag = hIvasEditableParameters.ism_metadata[obj].non_diegetic_flag; } } if ( fabsf( hIvasEditableParameters.gain_bed - 1.0f ) > OMASA_GAIN_EDIT_THR ) { hIvasDec->st_ivas->hMasaIsmData->gain_masa_edited = hIvasEditableParameters.gain_bed; hIvasDec->st_ivas->hMasaIsmData->masa_gain_is_edited = 1u; } else { hIvasDec->st_ivas->hMasaIsmData->masa_gain_is_edited = 0u; } } #endif return IVAS_ERR_OK; } Loading scripts/config/self_test.prm +0 −14 Original line number Diff line number Diff line Loading @@ -1947,17 +1947,3 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_10pct.g // OSBA 3OA 4ISM at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out ../IVAS_cod -ism_sba 4 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 512000 48 testv/stvOSBA_4ISM_3OA48c.wav bit ../IVAS_dec -render_config testv/rend_config_hospital_patientroom.cfg BINAURAL_ROOM_REVERB 48 bit testv/stvOSBA_4ISM_3OA48c.wav_BINAURAL_ROOM_REVERB_512000_48-48_custom_configuration.tst // 3 ISM with extended metadata bitrate switching, 48kHz in, 48kHz out, BINAURAL out, object editing ../IVAS_cod -ism +3 testv/stvISM1.csv null testv/stvISM3.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv3ISM48s.wav bit ../IVAS_dec -obj_edit BINAURAL 48 bit testv/stv3ISM48s.wav_brate_sw_48-48_BINAURAL_ObjEdit.tst // OMASA 2Dir2TC 2ISM bitrate switching, 48kHz in, 48kHz out, BINAURAL out, object editing ../IVAS_cod -ism_masa 2 2 testv/stvOMASA_2ISM_2MASA2TC48c_ISM1.csv null testv/stvOMASA_2ISM_2MASA2TC48c.met ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stvOMASA_2ISM_2MASA2TC48c.wav bit ../IVAS_dec -obj_edit BINAURAL 48 bit testv/stvOMASA_2ISM_2MASA2TC48c.wav_brate_sw_48-48_BINAURAL_ObjEdit.tst // OSBA FOA 3ISM bitrate switching 48kHz in, 48kHz out, BINAURAL out, object editing ../IVAS_cod -ism_sba 2 1 testv/stvISM1.csv null ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stvOSBA_2ISM_FOA48c.wav bit ../IVAS_dec -obj_edit BINAURAL 48 bit testv/stvOSBA_2ISM_FOA48c.wav_brate_sw_48-48_BINAURAL_ObjEdit.tst scripts/config/self_test_ltv.prm +0 −13 Original line number Diff line number Diff line Loading @@ -1946,16 +1946,3 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_10pct.g ../IVAS_cod -ism_sba 4 3 testv/ltvISM1.csv testv/ltvISM2.csv testv/ltvISM3.csv testv/ltvISM4.csv 512000 48 testv/ltv48_OSBA_4ISM_HOA3.wav bit ../IVAS_dec -render_config testv/rend_config_hospital_patientroom.cfg BINAURAL_ROOM_REVERB 48 bit testv/ltv48_OSBA_4ISM_HOA3.wav_BINAURAL_ROOM_REVERB_512000_48-48_custom_configuration.tst // 3 ISM with extended metadata bitrate switching, 48kHz in, 48kHz out, BINAURAL out, object editing ../IVAS_cod -ism +3 testv/ltvISM1.csv null testv/stvISM3.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/ltv48_3ISM.wav bit ../IVAS_dec -obj_edit BINAURAL 48 bit testv/ltv48_3ISM.wav_brate_sw_48-48_BINAURAL_ObjEdit.tst // OMASA 2Dir2TC 2ISM bitrate switching, 48kHz in, 48kHz out, BINAURAL out, object editing ../IVAS_cod -ism_masa 2 2 testv/ltv48_OMASA_2ISM_2TC_ISM1.csv null testv/ltv48_OMASA_2ISM_2TC.met ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/ltv48_OMASA_2ISM_2TC.wav bit ../IVAS_dec -obj_edit BINAURAL 48 bit testv/ltv48_OMASA_2ISM_2TC.wav_brate_sw_48-48_BINAURAL_ObjEdit.tst // OSBA FOA 3ISM bitrate switching 48kHz in, 48kHz out, BINAURAL out, object editing ../IVAS_cod -ism_sba 2 1 testv/ltvISM1.csv null ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/ltv48_OSBA_2ISM_FOA.wav bit ../IVAS_dec -obj_edit BINAURAL 48 bit testv/ltv48_OSBA_2ISM_FOA.wav_brate_sw_48-48_BINAURAL_ObjEdit.tst Loading
lib_dec/lib_dec.c +321 −0 Original line number Diff line number Diff line Loading @@ -1213,14 +1213,17 @@ ivas_error IVAS_DEC_GetEditableParameters( ) { int16_t dirac_read_idx, obj; #ifdef NONBE_1217_INIT_OBJ_EDIT Decoder_Struct *st_ivas; ISM_MODE ism_mode; #endif if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL || hIvasEditableParameters == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } #ifdef NONBE_1217_INIT_OBJ_EDIT st_ivas = hIvasDec->st_ivas; ism_mode = st_ivas->ism_mode; Loading Loading @@ -1345,6 +1348,114 @@ ivas_error IVAS_DEC_GetEditableParameters( #endif #endif } #else if ( !( hIvasDec->st_ivas->ivas_format == ISM_FORMAT || hIvasDec->st_ivas->ivas_format == SBA_ISM_FORMAT || hIvasDec->st_ivas->ivas_format == MASA_ISM_FORMAT || ( hIvasDec->st_ivas->ivas_format == MASA_FORMAT && hIvasDec->st_ivas->nchan_ism > 0 ) ) ) { return IVAS_ERROR( IVAS_ERR_OBJECTS_EDITING_NOT_SUPPORTED, "Object editing is not supported in this operation mode." ); } if ( hIvasEditableParameters == NULL || hIvasDec == NULL || hIvasDec->st_ivas == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } hIvasEditableParameters->gain_bed = 1.0f; hIvasEditableParameters->num_obj = hIvasDec->st_ivas->nchan_ism; if ( hIvasDec->st_ivas->ivas_format == ISM_FORMAT || hIvasDec->st_ivas->ivas_format == SBA_ISM_FORMAT ) { if ( hIvasDec->st_ivas->ism_mode == ISM_MODE_DISC || hIvasDec->st_ivas->ism_mode == ISM_SBA_MODE_DISC ) { for ( obj = 0; obj < hIvasEditableParameters->num_obj; obj++ ) { hIvasEditableParameters->ism_metadata[obj].azimuth = hIvasDec->st_ivas->hIsmMetaData[obj]->azimuth; hIvasEditableParameters->ism_metadata[obj].elevation = hIvasDec->st_ivas->hIsmMetaData[obj]->elevation; hIvasEditableParameters->ism_metadata[obj].yaw = hIvasDec->st_ivas->hIsmMetaData[obj]->yaw; hIvasEditableParameters->ism_metadata[obj].pitch = hIvasDec->st_ivas->hIsmMetaData[obj]->pitch; hIvasEditableParameters->ism_metadata[obj].radius = hIvasDec->st_ivas->hIsmMetaData[obj]->radius; hIvasEditableParameters->ism_metadata[obj].gain = hIvasDec->st_ivas->hIsmMetaData[obj]->edited_gain; hIvasEditableParameters->ism_metadata[obj].non_diegetic_flag = hIvasDec->st_ivas->hIsmMetaData[obj]->non_diegetic_flag; } if ( hIvasDec->st_ivas->ism_mode == ISM_SBA_MODE_DISC ) { hIvasEditableParameters->gain_bed = 1.0f; } } else if ( hIvasDec->st_ivas->ism_mode == ISM_MODE_PARAM ) { for ( obj = 0; obj < hIvasEditableParameters->num_obj; obj++ ) { hIvasEditableParameters->ism_metadata[obj].azimuth = hIvasDec->st_ivas->hParamIsmDec->azimuth_values[obj]; hIvasEditableParameters->ism_metadata[obj].elevation = hIvasDec->st_ivas->hParamIsmDec->elevation_values[obj]; hIvasEditableParameters->ism_metadata[obj].yaw = 0.0f; hIvasEditableParameters->ism_metadata[obj].pitch = 0.0f; hIvasEditableParameters->ism_metadata[obj].radius = 0.0f; hIvasEditableParameters->ism_metadata[obj].gain = 1.0f; hIvasEditableParameters->ism_metadata[obj].non_diegetic_flag = 0; } } else if ( hIvasDec->st_ivas->ism_mode == ISM_MODE_NONE ) { hIvasEditableParameters->num_obj = 0; } #ifdef DEBUGGING else { assert( 0 && "This should never happen!" ); } #endif } else if ( hIvasDec->st_ivas->ivas_format == MASA_ISM_FORMAT && ( hIvasDec->st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || hIvasDec->st_ivas->ism_mode == ISM_MASA_MODE_DISC ) ) { /* object editing possible only in two highest OMASA modes */ if ( hIvasDec->st_ivas->ism_mode == ISM_MASA_MODE_DISC ) { for ( obj = 0; obj < hIvasEditableParameters->num_obj; obj++ ) { hIvasEditableParameters->ism_metadata[obj].azimuth = hIvasDec->st_ivas->hIsmMetaData[obj]->azimuth; hIvasEditableParameters->ism_metadata[obj].elevation = hIvasDec->st_ivas->hIsmMetaData[obj]->elevation; hIvasEditableParameters->ism_metadata[obj].yaw = hIvasDec->st_ivas->hIsmMetaData[obj]->yaw; hIvasEditableParameters->ism_metadata[obj].pitch = hIvasDec->st_ivas->hIsmMetaData[obj]->pitch; hIvasEditableParameters->ism_metadata[obj].radius = hIvasDec->st_ivas->hIsmMetaData[obj]->radius; /* reset the otherwise unused "gain" field for the object */ hIvasDec->st_ivas->hIsmMetaData[obj]->edited_gain = 1.0f; hIvasEditableParameters->ism_metadata[obj].gain = hIvasDec->st_ivas->hIsmMetaData[obj]->edited_gain; hIvasEditableParameters->ism_metadata[obj].non_diegetic_flag = hIvasDec->st_ivas->hIsmMetaData[obj]->non_diegetic_flag; } } else { /* Handle MONO output */ if ( hIvasDec->st_ivas->renderer_type != RENDERER_MONO_DOWNMIX ) { dirac_read_idx = hIvasDec->st_ivas->hSpatParamRendCom->render_to_md_map[hIvasDec->st_ivas->hSpatParamRendCom->subframes_rendered]; } else { dirac_read_idx = 0; } for ( obj = 0; obj < hIvasEditableParameters->num_obj; obj++ ) { hIvasEditableParameters->ism_metadata[obj].azimuth = hIvasDec->st_ivas->hMasaIsmData->azimuth_ism[obj][dirac_read_idx]; hIvasEditableParameters->ism_metadata[obj].elevation = hIvasDec->st_ivas->hMasaIsmData->elevation_ism[obj][dirac_read_idx]; hIvasEditableParameters->ism_metadata[obj].yaw = hIvasDec->st_ivas->hIsmMetaData[obj]->yaw; hIvasEditableParameters->ism_metadata[obj].pitch = hIvasDec->st_ivas->hIsmMetaData[obj]->pitch; hIvasEditableParameters->ism_metadata[obj].radius = hIvasDec->st_ivas->hIsmMetaData[obj]->radius; /* reset the otherwise unused "gain" field for the object */ hIvasDec->st_ivas->hIsmMetaData[obj]->edited_gain = 1.0f; hIvasEditableParameters->ism_metadata[obj].gain = hIvasDec->st_ivas->hIsmMetaData[obj]->edited_gain; hIvasEditableParameters->ism_metadata[obj].non_diegetic_flag = hIvasDec->st_ivas->hIsmMetaData[obj]->non_diegetic_flag; } } } #endif return IVAS_ERR_OK; } Loading @@ -1362,6 +1473,7 @@ ivas_error IVAS_DEC_SetEditableParameters( ) { int16_t dirac_read_idx, obj; #ifdef NONBE_1217_INIT_OBJ_EDIT Decoder_Struct *st_ivas; ISM_MODE ism_mode; Loading Loading @@ -1577,6 +1689,215 @@ ivas_error IVAS_DEC_SetEditableParameters( st_ivas->hMasaIsmData->masa_gain_is_edited = 0u; } } #else if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } if ( !( hIvasDec->st_ivas->ivas_format == ISM_FORMAT || hIvasDec->st_ivas->ivas_format == SBA_ISM_FORMAT || hIvasDec->st_ivas->ivas_format == MASA_ISM_FORMAT || ( hIvasDec->st_ivas->ivas_format == MASA_FORMAT && hIvasDec->st_ivas->nchan_ism > 0 ) ) ) { return IVAS_ERROR( IVAS_ERR_OBJECTS_EDITING_NOT_SUPPORTED, "Object editing no supported in this operation mode." ); } if ( hIvasDec == NULL || hIvasDec->st_ivas == NULL ) { return IVAS_ERR_UNEXPECTED_NULL_POINTER; } #ifdef DEBUGGING assert( hIvasEditableParameters.num_obj == hIvasDec->st_ivas->nchan_ism ); #endif if ( hIvasDec->st_ivas->ivas_format == ISM_FORMAT || hIvasDec->st_ivas->ivas_format == SBA_ISM_FORMAT ) { if ( hIvasDec->st_ivas->ism_mode == ISM_MODE_DISC || hIvasDec->st_ivas->ism_mode == ISM_SBA_MODE_DISC ) { for ( obj = 0; obj < hIvasEditableParameters.num_obj; obj++ ) { hIvasDec->st_ivas->hIsmMetaData[obj]->edited_azimuth = hIvasEditableParameters.ism_metadata[obj].azimuth; hIvasDec->st_ivas->hIsmMetaData[obj]->edited_elevation = hIvasEditableParameters.ism_metadata[obj].elevation; hIvasDec->st_ivas->hIsmMetaData[obj]->edited_radius = hIvasEditableParameters.ism_metadata[obj].radius; hIvasDec->st_ivas->hIsmMetaData[obj]->edited_gain = hIvasEditableParameters.ism_metadata[obj].gain; hIvasDec->st_ivas->hIsmMetaData[obj]->edited_yaw = hIvasEditableParameters.ism_metadata[obj].yaw; hIvasDec->st_ivas->hIsmMetaData[obj]->edited_pitch = hIvasEditableParameters.ism_metadata[obj].pitch; hIvasDec->st_ivas->hIsmMetaData[obj]->non_diegetic_flag = hIvasEditableParameters.ism_metadata[obj].non_diegetic_flag; } if ( hIvasDec->st_ivas->ism_mode == ISM_SBA_MODE_DISC ) { hIvasDec->st_ivas->hSbaIsmData->gain_bed = hIvasEditableParameters.gain_bed; } } else if ( hIvasDec->st_ivas->ism_mode == ISM_MODE_PARAM ) { for ( obj = 0; obj < hIvasEditableParameters.num_obj; obj++ ) { hIvasDec->st_ivas->hParamIsmDec->edited_azimuth_values[obj] = hIvasEditableParameters.ism_metadata[obj].azimuth; hIvasDec->st_ivas->hParamIsmDec->edited_elevation_values[obj] = hIvasEditableParameters.ism_metadata[obj].elevation; hIvasDec->st_ivas->hMasaIsmData->gain_ism_edited[obj] = hIvasEditableParameters.ism_metadata[obj].gain; /* Detect direction editing in Param-ISM mode */ if ( fabsf( hIvasDec->st_ivas->hParamIsmDec->azimuth_values[obj] - hIvasEditableParameters.ism_metadata[obj].azimuth ) > OMASA_AZI_EDIT_THR || fabsf( hIvasDec->st_ivas->hParamIsmDec->elevation_values[obj] - hIvasEditableParameters.ism_metadata[obj].elevation ) > OMASA_ELE_EDIT_THR ) { hIvasDec->st_ivas->hMasaIsmData->ism_dir_is_edited[obj] = 1u; } else { hIvasDec->st_ivas->hMasaIsmData->ism_dir_is_edited[obj] = 0u; } /* Detect gain editing in Param-ISM mode */ if ( fabsf( 1.0f - hIvasEditableParameters.ism_metadata[obj].gain ) > OMASA_GAIN_EDIT_THR ) { hIvasDec->st_ivas->hMasaIsmData->ism_gain_is_edited[obj] = 1u; } else { hIvasDec->st_ivas->hMasaIsmData->ism_gain_is_edited[obj] = 0u; } } /* MASA is not present with the ISM format */ hIvasDec->st_ivas->hMasaIsmData->masa_gain_is_edited = 0u; } else if ( hIvasDec->st_ivas->ism_mode == ISM_MODE_NONE ) { if ( hIvasEditableParameters.num_obj != 0 ) { return IVAS_ERR_OBJECTS_EDITING_NOT_SUPPORTED; } } else { assert( 0 && "This should never happen!" ); } } else if ( hIvasDec->st_ivas->ivas_format == MASA_ISM_FORMAT && ( hIvasDec->st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ || hIvasDec->st_ivas->ism_mode == ISM_MASA_MODE_DISC ) ) { int16_t id_th; float threshold_azi, threshold_ele; for ( obj = 0; obj < hIvasEditableParameters.num_obj; obj++ ) { if ( hIvasDec->st_ivas->hMasaIsmData != NULL ) { /* copy relevant fields also to OMASA structs, but only if the value has been changed. original values are in st_ivas->hIsmMetaData */ /* first, need to convert float values to ints used internally */ int16_t new_azi, new_ele; if ( hIvasEditableParameters.ism_metadata[obj].azimuth > 0.0f ) { new_azi = (int16_t) ( hIvasEditableParameters.ism_metadata[obj].azimuth + 0.5f ); } else { new_azi = (int16_t) ( hIvasEditableParameters.ism_metadata[obj].azimuth - 0.5f ); } if ( hIvasEditableParameters.ism_metadata[obj].elevation > 0.0f ) { new_ele = (int16_t) ( hIvasEditableParameters.ism_metadata[obj].elevation + 0.5f ); } else { new_ele = (int16_t) ( hIvasEditableParameters.ism_metadata[obj].elevation - 0.5f ); } if ( hIvasDec->st_ivas->ism_mode == ISM_MASA_MODE_PARAM_ONE_OBJ ) { /* Handle MONO output */ if ( hIvasDec->st_ivas->renderer_type != RENDERER_MONO_DOWNMIX ) { dirac_read_idx = hIvasDec->st_ivas->hSpatParamRendCom->render_to_md_map[hIvasDec->st_ivas->hSpatParamRendCom->subframes_rendered]; } else { dirac_read_idx = 0; } /* determine thresholds for detecting object metadata edit for direction based on quantization resolution of the spatial direction parameters. * these depend from the number of bits used to transmit the directions, * which in turn depends from the object priority and importance: * importance -> priority -> number of bits -> elevation resolution -> elevation ring index -> azimuth resolution. * leading to elevation_resolution -> elevation threshold and azimuth resolution -> azimuth threshold */ id_th = (int16_t) ( fabsf( (float) hIvasDec->st_ivas->hMasaIsmData->elevation_ism[obj][dirac_read_idx] ) / delta_theta_masa[hIvasDec->st_ivas->hMasaIsmData->bits_ism[obj] - 3] + 0.5f ); threshold_azi = 360.0f / (float) no_phi_masa[hIvasDec->st_ivas->hMasaIsmData->bits_ism[obj] - 1][id_th]; threshold_ele = delta_theta_masa[hIvasDec->st_ivas->hMasaIsmData->bits_ism[obj] - 3]; if ( ( (float) abs( new_azi - hIvasDec->st_ivas->hMasaIsmData->azimuth_ism[obj][dirac_read_idx] ) > threshold_azi ) || ( (float) abs( new_ele - hIvasDec->st_ivas->hMasaIsmData->elevation_ism[obj][dirac_read_idx] ) > threshold_ele ) ) { /* at least one of the threshold is exceeded, so use new direction value and set editing detection flag */ hIvasDec->st_ivas->hMasaIsmData->azimuth_ism_edited[obj] = new_azi; hIvasDec->st_ivas->hMasaIsmData->elevation_ism_edited[obj] = new_ele; hIvasDec->st_ivas->hMasaIsmData->ism_dir_is_edited[obj] = 1u; } else { hIvasDec->st_ivas->hMasaIsmData->ism_dir_is_edited[obj] = 0u; } } else { /* detect editing in ISM_MASA_MODE_DISC. optionally, add quantization-resolution -based thresholds */ if ( fabsf( hIvasDec->st_ivas->hIsmMetaData[obj]->azimuth - hIvasEditableParameters.ism_metadata[obj].azimuth ) > OMASA_AZI_EDIT_THR || fabsf( hIvasDec->st_ivas->hIsmMetaData[obj]->elevation - hIvasEditableParameters.ism_metadata[obj].elevation ) > OMASA_ELE_EDIT_THR ) { hIvasDec->st_ivas->hMasaIsmData->azimuth_ism_edited[obj] = new_azi; hIvasDec->st_ivas->hMasaIsmData->elevation_ism_edited[obj] = new_ele; hIvasDec->st_ivas->hMasaIsmData->ism_dir_is_edited[obj] = 1u; } else { hIvasDec->st_ivas->hMasaIsmData->ism_dir_is_edited[obj] = 0u; } } /* compare pre-edit gain and the edited one to detect editing */ if ( fabsf( hIvasDec->st_ivas->hIsmMetaData[obj]->edited_gain - hIvasEditableParameters.ism_metadata[obj].gain ) > OMASA_GAIN_EDIT_THR ) { hIvasDec->st_ivas->hMasaIsmData->ism_gain_is_edited[obj] = 1u; hIvasDec->st_ivas->hMasaIsmData->gain_ism_edited[obj] = hIvasEditableParameters.ism_metadata[obj].gain; } else { hIvasDec->st_ivas->hMasaIsmData->ism_gain_is_edited[obj] = 0u; } } /* Copy edited values to hIsmMetaData struct */ if ( hIvasDec->st_ivas->hIsmMetaData[obj] != NULL ) { hIvasDec->st_ivas->hIsmMetaData[obj]->azimuth = hIvasEditableParameters.ism_metadata[obj].azimuth; hIvasDec->st_ivas->hIsmMetaData[obj]->elevation = hIvasEditableParameters.ism_metadata[obj].elevation; hIvasDec->st_ivas->hIsmMetaData[obj]->yaw = hIvasEditableParameters.ism_metadata[obj].yaw; hIvasDec->st_ivas->hIsmMetaData[obj]->pitch = hIvasEditableParameters.ism_metadata[obj].pitch; hIvasDec->st_ivas->hIsmMetaData[obj]->radius = hIvasEditableParameters.ism_metadata[obj].radius; hIvasDec->st_ivas->hIsmMetaData[obj]->edited_gain = hIvasEditableParameters.ism_metadata[obj].gain; hIvasDec->st_ivas->hIsmMetaData[obj]->non_diegetic_flag = hIvasEditableParameters.ism_metadata[obj].non_diegetic_flag; } } if ( fabsf( hIvasEditableParameters.gain_bed - 1.0f ) > OMASA_GAIN_EDIT_THR ) { hIvasDec->st_ivas->hMasaIsmData->gain_masa_edited = hIvasEditableParameters.gain_bed; hIvasDec->st_ivas->hMasaIsmData->masa_gain_is_edited = 1u; } else { hIvasDec->st_ivas->hMasaIsmData->masa_gain_is_edited = 0u; } } #endif return IVAS_ERR_OK; } Loading
scripts/config/self_test.prm +0 −14 Original line number Diff line number Diff line Loading @@ -1947,17 +1947,3 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_10pct.g // OSBA 3OA 4ISM at 512 kbps, 48kHz in, 48kHz out, BINAURAL_ROOM_REVERB out ../IVAS_cod -ism_sba 4 3 testv/stvISM1.csv testv/stvISM2.csv testv/stvISM3.csv testv/stvISM4.csv 512000 48 testv/stvOSBA_4ISM_3OA48c.wav bit ../IVAS_dec -render_config testv/rend_config_hospital_patientroom.cfg BINAURAL_ROOM_REVERB 48 bit testv/stvOSBA_4ISM_3OA48c.wav_BINAURAL_ROOM_REVERB_512000_48-48_custom_configuration.tst // 3 ISM with extended metadata bitrate switching, 48kHz in, 48kHz out, BINAURAL out, object editing ../IVAS_cod -ism +3 testv/stvISM1.csv null testv/stvISM3.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stv3ISM48s.wav bit ../IVAS_dec -obj_edit BINAURAL 48 bit testv/stv3ISM48s.wav_brate_sw_48-48_BINAURAL_ObjEdit.tst // OMASA 2Dir2TC 2ISM bitrate switching, 48kHz in, 48kHz out, BINAURAL out, object editing ../IVAS_cod -ism_masa 2 2 testv/stvOMASA_2ISM_2MASA2TC48c_ISM1.csv null testv/stvOMASA_2ISM_2MASA2TC48c.met ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stvOMASA_2ISM_2MASA2TC48c.wav bit ../IVAS_dec -obj_edit BINAURAL 48 bit testv/stvOMASA_2ISM_2MASA2TC48c.wav_brate_sw_48-48_BINAURAL_ObjEdit.tst // OSBA FOA 3ISM bitrate switching 48kHz in, 48kHz out, BINAURAL out, object editing ../IVAS_cod -ism_sba 2 1 testv/stvISM1.csv null ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/stvOSBA_2ISM_FOA48c.wav bit ../IVAS_dec -obj_edit BINAURAL 48 bit testv/stvOSBA_2ISM_FOA48c.wav_brate_sw_48-48_BINAURAL_ObjEdit.tst
scripts/config/self_test_ltv.prm +0 −13 Original line number Diff line number Diff line Loading @@ -1946,16 +1946,3 @@ eid-xor -fer -vbr -bs g192 -ep g192 bit ../scripts/dly_error_profiles/ep_10pct.g ../IVAS_cod -ism_sba 4 3 testv/ltvISM1.csv testv/ltvISM2.csv testv/ltvISM3.csv testv/ltvISM4.csv 512000 48 testv/ltv48_OSBA_4ISM_HOA3.wav bit ../IVAS_dec -render_config testv/rend_config_hospital_patientroom.cfg BINAURAL_ROOM_REVERB 48 bit testv/ltv48_OSBA_4ISM_HOA3.wav_BINAURAL_ROOM_REVERB_512000_48-48_custom_configuration.tst // 3 ISM with extended metadata bitrate switching, 48kHz in, 48kHz out, BINAURAL out, object editing ../IVAS_cod -ism +3 testv/ltvISM1.csv null testv/stvISM3.csv ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/ltv48_3ISM.wav bit ../IVAS_dec -obj_edit BINAURAL 48 bit testv/ltv48_3ISM.wav_brate_sw_48-48_BINAURAL_ObjEdit.tst // OMASA 2Dir2TC 2ISM bitrate switching, 48kHz in, 48kHz out, BINAURAL out, object editing ../IVAS_cod -ism_masa 2 2 testv/ltv48_OMASA_2ISM_2TC_ISM1.csv null testv/ltv48_OMASA_2ISM_2TC.met ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/ltv48_OMASA_2ISM_2TC.wav bit ../IVAS_dec -obj_edit BINAURAL 48 bit testv/ltv48_OMASA_2ISM_2TC.wav_brate_sw_48-48_BINAURAL_ObjEdit.tst // OSBA FOA 3ISM bitrate switching 48kHz in, 48kHz out, BINAURAL out, object editing ../IVAS_cod -ism_sba 2 1 testv/ltvISM1.csv null ../scripts/switchPaths/sw_24k4_256k.bin 48 testv/ltv48_OSBA_2ISM_FOA.wav bit ../IVAS_dec -obj_edit BINAURAL 48 bit testv/ltv48_OSBA_2ISM_FOA.wav_brate_sw_48-48_BINAURAL_ObjEdit.tst