diff --git a/decoder/ia_core_coder_cnst.h b/decoder/ia_core_coder_cnst.h index 5a9af68..7daceb7 100644 --- a/decoder/ia_core_coder_cnst.h +++ b/decoder/ia_core_coder_cnst.h @@ -166,15 +166,20 @@ #define CORE_LEFT 0 #define CORE_RIGHT 1 -#define MAX_NUM_ELEMENTS 50 -#define MAX_NUM_CHANNELS 24 -#define MAX_NUM_CHANNELS_LVL1 5 -#define MAX_NUM_CHANNELS_LVL2 9 -#define MAX_NUM_CHANNELS_LVL3 16 +#define MAX_NUM_CHANNELS_LVL1 (10) +#define MAX_NUM_CHANNELS_LVL2 (18) +#define MAX_NUM_CHANNELS_LVL3 (32) #ifdef LC_LEVEL_4 -#define MAX_NUM_CHANNELS_LVL4 (28) +#define MAX_NUM_CHANNELS_LVL4 (56) +#define MAX_NUM_CHANNELS (56) +#define MAX_CORE_CODER_CHANS (56) +#else +#define MAX_NUM_CHANNELS_LVL4 (32) +#define MAX_NUM_CHANNELS (32) +#define MAX_CORE_CODER_CHANS (32) #endif -#define MAX_NUM_CHANNELS_USAC_LVL2 24 + +#define MAX_NUM_ELEMENTS (2 * MAX_CORE_CODER_CHANS + (MAX_CORE_CODER_CHANS >> 1)) #define SFB_NUM_MAX ((NSFB_SHORT + 1) * MAX_SHORT_IN_LONG_BLOCK) diff --git a/decoder/ia_core_coder_config.h b/decoder/ia_core_coder_config.h index 20492bd..202fb35 100644 --- a/decoder/ia_core_coder_config.h +++ b/decoder/ia_core_coder_config.h @@ -37,12 +37,13 @@ #include -#define MAX_ELEMENTS_USAC (50) + // MAX_NUM_CHANNELS * 1.5 +#define MAX_EXT_ELEMENTS (84) #ifdef LC_LEVEL_4 // The bit stream extracted value can be 32. // Currently this is limited to 3 considering: // Audio Channels, Objects and HOA Transport channels. -#define MAX_NUM_SIGNALGROUPS (28) +#define MAX_NUM_SIGNALGROUPS (32) /* The multiā€channel coding tool (MCT) shall not employ * more stereo boxes than 28 for LC profile lvl 4*/ #define MAX_NUM_MC_BOXES (28) @@ -404,6 +405,8 @@ typedef struct { WORD32 frame_length; WORD32 cc_frame_length; + WORD32 num_objects; + WORD32 sig_start_id; FLAG ld_md_coding_present; FLAG dyn_obj_priority_present; FLAG uniform_spread_present; @@ -431,6 +434,10 @@ typedef struct UWORD32 group_type[MAX_AUDIO_GROUPS]; UWORD32 num_sig[MAX_AUDIO_GROUPS]; UWORD32 differs_from_ref_layout[MAX_AUDIO_GROUPS]; + UWORD32 inactive_signals[MAX_NUM_CHANNELS]; + UWORD32 inactive_signal_grp[MAX_AUDIO_GROUPS]; + UWORD32 num_grp_objs[MAX_AUDIO_GROUPS]; + UWORD32 num_grp_tc[MAX_AUDIO_GROUPS]; UWORD32 num_ch; UWORD32 num_audio_obj; UWORD32 num_saoc_transport_ch; @@ -507,29 +514,29 @@ typedef struct { UWORD32 num_elements; UWORD32 num_config_extensions; - UWORD32 usac_element_type[MAX_ELEMENTS_USAC]; - WORD32 ia_ext_ele_payload_type[MAX_ELEMENTS_USAC]; + UWORD32 usac_element_type[MAX_NUM_ELEMENTS]; + WORD32 ia_ext_ele_payload_type[MAX_NUM_ELEMENTS]; ia_multichannel_data ia_mcdata[MAX_NUM_SIGNALGROUPS]; UWORD32 ia_ext_element_start; UWORD32 ia_ext_element_stop; ia_sfb_info *ia_sfb_info[MAX_TIME_CHANNELS]; - WORD32 num_output_chns[MAX_ELEMENTS_USAC]; + WORD32 num_output_chns[MAX_NUM_ELEMENTS]; ia_hoa_config_struct str_hoa_config; WORD32 ele_length_present; ia_usac_ext_cfg_dmx_cfg dmx_cfg; WORD32 cicp_idx; - ia_usac_dec_element_config_struct str_usac_element_config[MAX_ELEMENTS_USAC]; + ia_usac_dec_element_config_struct str_usac_element_config[MAX_NUM_ELEMENTS]; WORD32 usac_cfg_ext_info_present[MAX_CONFIG_EXTENSIONS]; - WORD32 usac_ext_ele_payload_present[MAX_ELEMENTS_USAC]; + WORD32 usac_ext_ele_payload_present[MAX_NUM_ELEMENTS]; WORD32 usac_cfg_ext_info_len[MAX_CONFIG_EXTENSIONS]; WORD32 usac_cfg_ext_info_type[MAX_CONFIG_EXTENSIONS]; - WORD32 usac_ext_ele_payload_len[MAX_ELEMENTS_USAC]; - WORD32 usac_ext_gain_payload_len[MAX_ELEMENTS_USAC]; + WORD32 usac_ext_ele_payload_len[MAX_NUM_ELEMENTS]; + WORD32 usac_ext_gain_payload_len[MAX_NUM_ELEMENTS]; WORD32 usac_ext_gain_payload_prev_len; UWORD8 usac_cfg_ext_info_buf[MAX_CONFIG_EXTENSIONS][MAX_EXT_ELE_PAYLOAD]; - UWORD8 usac_ext_ele_payload_buf[MAX_ELEMENTS_USAC][MAX_EXT_ELE_PAYLOAD]; - UWORD8 usac_ext_gain_payload_buf[MAX_ELEMENTS_USAC][MAX_AUDIO_PREROLLS * MAX_EXT_ELE_PAYLOAD]; + UWORD8 usac_ext_ele_payload_buf[MAX_NUM_ELEMENTS][MAX_EXT_ELE_PAYLOAD]; + UWORD8 usac_ext_gain_payload_buf[MAX_NUM_ELEMENTS][MAX_AUDIO_PREROLLS * MAX_EXT_ELE_PAYLOAD]; UWORD8 usac_ext_gain_payload_prev_buf[MAX_EXT_ELE_PAYLOAD]; WORD32 loudness_ext_config_present; WORD32 loudness_ext_config_idx; @@ -576,7 +583,7 @@ typedef struct UINT32 receiver_delay_compensation; ia_usac_decoder_config_struct str_usac_dec_config; ia_signals_3d signals_3d; - ia_oam_dec_config_struct obj_md_cfg; + ia_oam_dec_config_struct obj_md_cfg[MAX_AUDIO_GROUPS]; ia_enh_oam_config_struct enh_obj_md_cfg; ia_drc_config uni_drc_cfg; ia_drc_params_bs_dec_struct uni_drc_bs_params; diff --git a/decoder/ia_core_coder_create.c b/decoder/ia_core_coder_create.c index 6c80235..3c90eb7 100644 --- a/decoder/ia_core_coder_create.c +++ b/decoder/ia_core_coder_create.c @@ -244,8 +244,9 @@ static IA_ERRORCODE ia_core_coder_decode_init(VOID *handle, ia_usac_data_struct ia_usac_config_struct *ptr_usac_config = &(pstr_stream_config->str_usac_config); ia_usac_decoder_config_struct *ptr_usac_dec_config = &(pstr_stream_config->str_usac_config.str_usac_dec_config); + ia_signals_3d *pstr_signals = &ptr_usac_config->signals_3d; - WORD32 sample, ch, element_id = 0, slpd_index = 0, chan = 0, + WORD32 sample, ch, element_id = 0, slpd_index = 0, chan = 0, tot_chan = 0, num_elements = ptr_usac_dec_config->num_elements, typ; UWORD32 element_type; @@ -322,7 +323,13 @@ static IA_ERRORCODE ia_core_coder_decode_init(VOID *handle, ia_usac_data_struct case ID_USAC_CPE: { - if (chan > MAX_NUM_CHANNELS_USAC_LVL2 - 2) + if (pstr_signals->inactive_signals[tot_chan]) + { + tot_chan += 2; + break; + } + tot_chan += 2; + if (chan > MAX_NUM_CHANNELS - 2) return IA_MPEGH_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX; for (typ = 0; typ < 2; typ++) { @@ -348,8 +355,14 @@ static IA_ERRORCODE ia_core_coder_decode_init(VOID *handle, ia_usac_data_struct break; case ID_USAC_LFE: { + if (pstr_signals->inactive_signals[tot_chan]) + { + tot_chan += 1; + break; + } + tot_chan += 1; /*fix for bug:119118558*/ - if (chan > MAX_NUM_CHANNELS_USAC_LVL2 - 1) + if (chan > MAX_NUM_CHANNELS - 1) return IA_MPEGH_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX; usac_data->seed_value[chan] = 0x3039; chan++; @@ -358,7 +371,13 @@ static IA_ERRORCODE ia_core_coder_decode_init(VOID *handle, ia_usac_data_struct break; case ID_USAC_SCE: { - if (chan > MAX_NUM_CHANNELS_USAC_LVL2 - 1) + if (pstr_signals->inactive_signals[tot_chan]) + { + tot_chan += 1; + break; + } + tot_chan += 1; + if (chan > MAX_NUM_CHANNELS - 1) return IA_MPEGH_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX; usac_data->seed_value[chan] = 0x3039; @@ -570,11 +589,6 @@ WORD32 ia_core_coder_frm_data_init(ia_audio_specific_config_struct *pstr_audio_c pstr_dec_data->str_frame_data.str_audio_specific_config.cicp_spk_layout_idx; } - pstr_dec_data->str_obj_ren_dec_state.str_obj_md_dec_state.num_objects = - pstr_dec_data->str_frame_data.str_audio_specific_config.str_usac_config.signals_3d - .num_audio_obj; - pstr_dec_data->str_obj_ren_dec_state.str_obj_md_dec_state.p_obj_md_cfg = - &pstr_dec_data->str_frame_data.str_audio_specific_config.str_usac_config.obj_md_cfg; memset(&pstr_dec_data->str_frame_data.str_layer, 0, sizeof(pstr_dec_data->str_frame_data.str_layer)); diff --git a/decoder/ia_core_coder_decode_main.c b/decoder/ia_core_coder_decode_main.c index 137f834..5cfefc9 100644 --- a/decoder/ia_core_coder_decode_main.c +++ b/decoder/ia_core_coder_decode_main.c @@ -665,8 +665,6 @@ IA_ERRORCODE impeghd_format_conv_init(ia_mpegh_dec_api_struct *p_obj_mpegh_dec, memset(&pstr_obj_renderer->str_obj_md_dec_state, 0, sizeof(*p_obj_md_cfg)); - pstr_obj_renderer->str_obj_md_dec_state.p_obj_md_cfg = p_obj_md_cfg; - pstr_obj_renderer->str_obj_md_dec_state.num_objects = num_out_chn; pstr_obj_renderer->pstr_local_setup = &pstr_decoder->str_local_setup_interaction; pstr_obj_renderer->cicp_out_idx = cicp_idx; @@ -904,163 +902,299 @@ static IA_ERRORCODE ia_core_coder_audio_preroll_parsing(ia_dec_data_struct *pstr } /** - * impeghd_mdp_dec_process + * ia_asi_get_group_idx * - * \brief Metadata PreProcessing decoder main function + * \brief Returns group index corresponding to the ID. * - * \param [in] pstr_asc Pointer to audio specific config structure - * \param [in,out] pstr_dec_data Pointer to decoder data structure - * \param [in] num_out_channels Pointer to number of output channels info - * \param [in] scratch_mem Pointer to scratch memory. - * \param [in] preset_id Preset id value from command line. + * \param [in] group_id Group ID. + * \param [in] ptr_mae_asi Pointer to MAE data structure. * - * \return IA_ERRORCODE Processing error if any. + * \return WORD32 Group index, 0 is returned when there is no match. * */ -IA_ERRORCODE impeghd_mdp_dec_process(ia_audio_specific_config_struct *pstr_asc, - ia_dec_data_struct *pstr_dec_data, WORD32 num_out_channels, - FLOAT32 *scratch_mem, WORD32 preset_id) +WORD32 ia_asi_get_group_idx(WORD32 group_id, ia_mae_audio_scene_info *ptr_mae_asi) { - WORD32 channel, grp, mbr, cond, ccfl, num_decoded_groups, num_elements = 0; - IA_ERRORCODE err_code = IA_MPEGH_DEC_NO_ERROR; + WORD32 g = 0; + for (g = 0; g < ptr_mae_asi->num_groups; g++) + { + if (ptr_mae_asi->group_definition[g].group_id == group_id) + { + return g; + } + } + return 0; +} - FLOAT32 *audio_in_buff[MAX_NUM_CHANNELS], *audio_out_buff[MAX_NUM_CHANNELS]; +/** + * ia_asi_get_sw_grp_idx + * + * \brief Returns switch group index corresponding to the ID. + * + * \param [in] sw_grp_id Switch group ID. + * \param [in] ptr_mae_asi Pointer to MAE data structure. + * + * \return WORD32 Switch Group index, 0 is returned when there is no match. + * + */ +WORD32 ia_asi_get_sw_grp_idx(WORD32 sw_grp_id, ia_mae_audio_scene_info *ptr_mae_asi) +{ + WORD32 sg = 0; + for (sg = 0; sg < ptr_mae_asi->num_switch_groups; sg++) + { + if (ptr_mae_asi->switch_group_definition[sg].group_id == sw_grp_id) + { + return sg; + } + } + return 0; +} - ia_mae_audio_scene_info *ptr_mae_asi = &pstr_asc->str_mae_asi; +/** + * ia_asi_get_preset_idx + * + * \brief Returns preset group index corresponding to the ID. + * + * \param [in] pr_id Preset id. + * \param [in] ptr_mae_asi Pointer to MAE data structure. + * + * \return WORD32 Preset index, 0 is returned when there is no match. + * + */ +WORD32 ia_asi_get_preset_idx(WORD32 pr_id, ia_mae_audio_scene_info *ptr_mae_asi) +{ + WORD32 pr = 0; + for (pr = 0; pr < ptr_mae_asi->num_group_presets; pr++) + { + if (ptr_mae_asi->group_presets_definition[pr].group_id == pr_id) + { + return pr; + } + } + return 0; +} - ccfl = pstr_dec_data->str_usac_data.ccfl; - num_decoded_groups = ptr_mae_asi->num_groups; +/** + * ia_core_code_mdp + * + * \brief Identifies the active and inactive signals based on ASI. + * + * \param [in,out] handle MPEG-H decoder handle + * \param [in] preset_id Preset ID chosen by the user. + * + * \return IA_ERRORCODE Processing error if any. + * + */ +IA_ERRORCODE ia_core_code_mdp(VOID *handle, WORD32 preset_id) +{ + ia_mpegh_dec_api_struct *p_obj_mpegh_dec = (ia_mpegh_dec_api_struct *)handle; + ia_audio_specific_config_struct *pstr_asc = + (ia_audio_specific_config_struct *)p_obj_mpegh_dec->p_state_mpeghd->ia_audio_specific_config; + WORD32 grp, mbr, cond, num_groups, num_elements = 0; - for (channel = 0; channel < num_out_channels; channel++) + ia_mae_audio_scene_info *ptr_mae_asi = &pstr_asc->str_mae_asi; + if (!ptr_mae_asi->asi_present || ptr_mae_asi->num_groups == 0) { - audio_out_buff[channel] = scratch_mem + (channel * ccfl); - ia_core_coder_memset(audio_out_buff[channel], ccfl); - audio_in_buff[channel] = &pstr_dec_data->str_usac_data.time_sample_vector[channel][0]; + return 0; } - for (grp = 0; grp < num_decoded_groups; grp++) + for (grp = 0; grp < MAX_NUM_CHANNELS; grp++) { - num_elements += ptr_mae_asi->group_definition[grp].group_num_members; + pstr_asc->str_usac_config.signals_3d.inactive_signals[grp] = 1; } - - /* Element interaction related processing has to happen here*/ - if (ptr_mae_asi->ei_present || pstr_dec_data->str_element_interaction.ei_data_present || - pstr_dec_data->str_scene_displacement.scene_dspl_data_present) + for (grp = 0; grp < MAX_AUDIO_GROUPS; grp++) { - /* Element interaction related processing has to happen here*/ - err_code = impeghd_mdp_dec_ei_process(pstr_asc, pstr_dec_data, num_out_channels, - (WORD8 *)scratch_mem, &preset_id); - if (err_code != IA_MPEGH_DEC_NO_ERROR) + pstr_asc->str_usac_config.signals_3d.inactive_signal_grp[grp] = 1; + } + num_groups = ptr_mae_asi->num_groups; + + for (grp = 0; grp < num_groups; grp++) { - return err_code; - } + num_elements += ptr_mae_asi->group_definition[grp].group_num_members; } - /* Gain Interactivity processing block*/ if (-1 != preset_id) { WORD32 pr_grp_idx = -1; WORD32 grp_idx = -1; - for (grp = 0; grp < num_decoded_groups; grp++) + for (grp = 0; grp < ptr_mae_asi->num_group_presets; grp++) { if (ptr_mae_asi->group_presets_definition[grp].group_id == preset_id) { - pr_grp_idx = grp; + pr_grp_idx = ia_asi_get_preset_idx(preset_id, ptr_mae_asi); break; } } if (pr_grp_idx == -1) { - /* Invalid Preset Id */ - return IA_MPEGH_DEC_EXE_FATAL_INVALID_PRESET_ID; + pr_grp_idx = 0; } - for (grp = 0; grp < num_decoded_groups; grp++) + for (grp = 0; grp < num_groups; grp++) { WORD32 grp_id = ptr_mae_asi->group_definition[grp].group_id; - WORD32 member_id = 0; - WORD32 num_members = ptr_mae_asi->group_definition[grp].group_num_members; WORD32 has_conjuct_mbrs; + grp_idx = -1; for (cond = 0; cond < ptr_mae_asi->group_presets_definition[pr_grp_idx].num_conditions; cond++) { - if (ptr_mae_asi->group_presets_definition[pr_grp_idx].reference_id[cond] == grp_id) + if (ptr_mae_asi->group_presets_definition[pr_grp_idx].reference_id[cond] == grp_id && + !(ptr_mae_asi->group_presets_ext_definition.has_switch_group_conditions[pr_grp_idx] && + ptr_mae_asi->group_presets_ext_definition.is_switch_group_condition[pr_grp_idx][cond])) { - grp_idx = cond; + grp_idx = ia_asi_get_group_idx(grp_id, ptr_mae_asi); break; } } if (grp_idx == -1) { - /* Invalid Group Id */ - return IA_MPEGH_DEC_EXE_FATAL_INVALID_GRP_ID; + continue; } - if (0 == ptr_mae_asi->group_presets_definition[pr_grp_idx].cond_on_off[grp_idx]) + has_conjuct_mbrs = ptr_mae_asi->group_definition[grp_idx].has_conjunct_members; + if (0 != ptr_mae_asi->group_presets_definition[pr_grp_idx].cond_on_off[cond]) { - has_conjuct_mbrs = ptr_mae_asi->group_definition[grp].has_conjunct_members; + if (has_conjuct_mbrs) + { + WORD32 start_offset = ptr_mae_asi->group_definition[grp_idx].start_id; + for (mbr = 0; mbr < ptr_mae_asi->group_definition[grp_idx].group_num_members; mbr++) + { + pstr_asc->str_usac_config.signals_3d.inactive_signals[start_offset + mbr] = 0; + } } else { - has_conjuct_mbrs = ptr_mae_asi->group_definition[cond].has_conjunct_members; + for (mbr = 0; mbr < ptr_mae_asi->group_definition[grp_idx].group_num_members; mbr++) + { + WORD32 idx = ptr_mae_asi->group_definition[grp_idx].metadata_ele_id[mbr]; + pstr_asc->str_usac_config.signals_3d.inactive_signals[idx] = 0; + } + } + } } - for (mbr = 0; mbr < num_members; mbr++) + if (ptr_mae_asi->group_presets_ext_definition.has_switch_group_conditions[pr_grp_idx]) + { + for (grp = 0; grp < ptr_mae_asi->num_switch_groups; grp++) { - if (0 == has_conjuct_mbrs) - { - member_id = ptr_mae_asi->group_definition[grp].metadata_ele_id[mbr]; - } - else + WORD32 grp_id = ptr_mae_asi->switch_group_definition[grp].group_id; + grp_idx = -1; + for (cond = 0; cond < ptr_mae_asi->group_presets_definition[pr_grp_idx].num_conditions; + cond++) { - member_id = ptr_mae_asi->group_definition[grp].start_id + mbr; + if (ptr_mae_asi->group_presets_definition[pr_grp_idx].reference_id[cond] == grp_id && + ptr_mae_asi->group_presets_ext_definition.is_switch_group_condition[pr_grp_idx][cond]) + { + grp_idx = cond; + break; + } } - - if (member_id < 0 || member_id >= num_out_channels) + if (grp_idx == -1) { - return IA_MPEGH_DEC_EXE_FATAL_UNSUPPORTED_NUM_CHANNELS; + continue; } if (0 != ptr_mae_asi->group_presets_definition[pr_grp_idx].cond_on_off[grp_idx]) { - ia_core_coder_mem_cpy(audio_in_buff[member_id], audio_out_buff[member_id], ccfl); + WORD32 sg_idx = ia_asi_get_sw_grp_idx(grp_id, ptr_mae_asi); + grp_id = ptr_mae_asi->switch_group_definition[sg_idx].default_group_id; + grp_idx = ia_asi_get_group_idx(grp_id, ptr_mae_asi); + if (ptr_mae_asi->group_definition[grp_idx].has_conjunct_members) + { + WORD32 start_offset = ptr_mae_asi->group_definition[grp_idx].start_id; + for (mbr = 0; mbr < ptr_mae_asi->group_definition[grp_idx].group_num_members; mbr++) + { + pstr_asc->str_usac_config.signals_3d.inactive_signals[start_offset + mbr] = 0; + } } else { - ia_core_coder_memset(audio_out_buff[member_id], ccfl); + for (mbr = 0; mbr < ptr_mae_asi->group_definition[grp_idx].group_num_members; mbr++) + { + WORD32 idx = ptr_mae_asi->group_definition[grp_idx].metadata_ele_id[mbr]; + pstr_asc->str_usac_config.signals_3d.inactive_signals[idx] = 0; + } + } } } } } else { - for (grp = 0; grp < num_decoded_groups; grp++) + WORD32 member_id = 0; + for (grp = 0; grp < num_groups; grp++) { - WORD32 num_members = ptr_mae_asi->group_definition[grp].group_num_members; - WORD32 member_id = 0; - - for (mbr = 0; mbr < num_members; mbr++) + if (0 != ptr_mae_asi->group_definition[grp].default_on_off) + { + if (member_id < 0 || member_id >= num_elements) + { + return IA_MPEGH_DEC_EXE_FATAL_UNSUPPORTED_NUM_CHANNELS; + } + if (ptr_mae_asi->group_definition[grp].has_conjunct_members) { - if (0 == ptr_mae_asi->group_definition[grp].has_conjunct_members) + WORD32 start_offset = ptr_mae_asi->group_definition[grp].start_id; + for (mbr = ptr_mae_asi->group_definition[grp].start_id; mbr < ptr_mae_asi->group_definition[grp].group_num_members; mbr++) { - member_id = ptr_mae_asi->group_definition[grp].metadata_ele_id[mbr]; + pstr_asc->str_usac_config.signals_3d.inactive_signals[start_offset + mbr] = 0; + } } else { - member_id = ptr_mae_asi->group_definition[grp].start_id + mbr; + for (mbr = 0; mbr < ptr_mae_asi->group_definition[grp].group_num_members; mbr++) + { + WORD32 idx = ptr_mae_asi->group_definition[grp].metadata_ele_id[mbr]; + pstr_asc->str_usac_config.signals_3d.inactive_signals[idx] = 0; + } + } + } } - if (0 != ptr_mae_asi->group_definition[grp].default_on_off) + for (grp = 0; grp < ptr_mae_asi->num_switch_groups; grp++) + { + WORD32 grp_idx = 0; + member_id = ptr_mae_asi->switch_group_definition[grp].default_group_id; + grp_idx = ia_asi_get_group_idx(member_id, ptr_mae_asi); + if (0 != ptr_mae_asi->switch_group_definition[grp].default_on_off) { - if (member_id < 0 || member_id >= num_out_channels) + if (member_id < 0 || member_id >= num_elements) { return IA_MPEGH_DEC_EXE_FATAL_UNSUPPORTED_NUM_CHANNELS; } - - ia_core_coder_mem_cpy(audio_in_buff[member_id], audio_out_buff[member_id], ccfl); + if (ptr_mae_asi->group_definition[grp_idx].has_conjunct_members) + { + WORD32 offset = ptr_mae_asi->group_definition[grp_idx].start_id; + for (mbr = 0; mbr < ptr_mae_asi->group_definition[grp_idx].group_num_members; mbr++) + { + pstr_asc->str_usac_config.signals_3d.inactive_signals[mbr + offset] = 0; + } } + else + { + for (mbr = 0; mbr < ptr_mae_asi->group_definition[grp_idx].group_num_members; mbr++) + { + WORD32 idx = ptr_mae_asi->group_definition[grp_idx].metadata_ele_id[mbr]; + pstr_asc->str_usac_config.signals_3d.inactive_signals[idx] = 0; + } + } + } + } + } + num_elements = 0; + for (grp = 0; grp < (WORD32)pstr_asc->str_usac_config.signals_3d.num_sig_group; grp++) + { + WORD32 all_sig_active = 0; + for (mbr = 0; mbr < (WORD32)pstr_asc->str_usac_config.signals_3d.num_sig[grp]; mbr++) + { + if (pstr_asc->str_usac_config.signals_3d.inactive_signals[mbr + num_elements] == 0) + { + all_sig_active = 1; } + else + { + all_sig_active = 0; + break; } } - for (channel = 0; channel < num_out_channels; channel++) + if (all_sig_active) { - ia_core_coder_mem_cpy(audio_out_buff[channel], audio_in_buff[channel], ccfl); + pstr_asc->str_usac_config.signals_3d.inactive_signal_grp[grp] = 0; + } + num_elements += pstr_asc->str_usac_config.signals_3d.num_sig[grp]; } return IA_MPEGH_DEC_NO_ERROR; } @@ -1308,16 +1442,18 @@ static IA_ERRORCODE impeghd_earcon_obj_md_dec_ren_process(ia_dec_data_struct *ps ia_earcon_info *pstr_earcon_info = &pstr_asc->str_mae_asi.earcon_info; ia_obj_ren_dec_state_struct *pstr_obj_ren_dec_state = &pstr_dec_data->str_obj_ren_dec_state; ia_oam_dec_state_struct *pstr_obj_md_dec_state = &pstr_obj_ren_dec_state->str_obj_md_dec_state; + ia_oam_dec_config_struct str_oam_md_cfg = { 0 }; - num_objects = pstr_obj_md_dec_state->num_objects; ccfl = ia_pcm_frame_size_tbl[pstr_pcm_data_config->pcm_frame_size_idx]; ptr_in_buf = &pstr_pcm_data_config->pcm_sample[0][0]; ia_core_coder_memset(ptr_out_buf, (ccfl * pstr_obj_ren_dec_state->num_cicp_speakers)); pstr_obj_md_dec_state->sub_frame_number = 1; - pstr_obj_md_dec_state->num_objects = (pstr_pcm_data_config->bs_num_pcm_signals + 1); - for (obj = 0; obj < pstr_obj_md_dec_state->num_objects; obj++) + num_objects = (pstr_pcm_data_config->bs_num_pcm_signals + 1); + str_oam_md_cfg.num_objects = num_objects; + str_oam_md_cfg.cc_frame_length = str_oam_md_cfg.frame_length = ccfl; + for (obj = 0; obj < num_objects; obj++) { pstr_obj_md_dec_state->radius[obj] = pstr_earcon_info->earcon_distance[0]; pstr_obj_md_dec_state->elevation[obj] = pstr_earcon_info->earcon_elevation[0]; @@ -1336,12 +1472,12 @@ static IA_ERRORCODE impeghd_earcon_obj_md_dec_ren_process(ia_dec_data_struct *ps pstr_obj_md_dec_state->gain_descaled[obj] = (FLOAT32)pow(10.0f, (pstr_obj_md_dec_state->gain[obj] - 32.0f) / 40.0f); } - err_code = impeghd_obj_renderer_dec(pstr_obj_ren_dec_state, ptr_in_buf, ptr_out_buf, ccfl); + err_code = impeghd_obj_renderer_dec(pstr_obj_ren_dec_state, &str_oam_md_cfg, ptr_in_buf, + ptr_out_buf, ccfl); if (err_code) { return err_code; } - pstr_obj_md_dec_state->num_objects = num_objects; return err_code; } @@ -1351,6 +1487,7 @@ static IA_ERRORCODE impeghd_earcon_obj_md_dec_ren_process(ia_dec_data_struct *ps * \brief Object metadata renderer main process function. * * \param [in,out] pstr_dec_data Pointer to decoder data structure. + * \param [in] p_obj_md_cfg Pointer to object metadata configuration buffer. * \param [out] ptr_out_buf Pointer to output buffer. * \param [in,out] num_out_channels Pointer to number of output channels parameter. * \param [in] ch_offset Offest for audio object output. @@ -1359,14 +1496,12 @@ static IA_ERRORCODE impeghd_earcon_obj_md_dec_ren_process(ia_dec_data_struct *ps * */ IA_ERRORCODE -impeghd_obj_md_dec_ren_process(ia_dec_data_struct *pstr_dec_data, FLOAT32 *ptr_out_buf, +impeghd_obj_md_dec_ren_process(ia_dec_data_struct *pstr_dec_data, + ia_oam_dec_config_struct *p_obj_md_cfg, FLOAT32 *ptr_out_buf, WORD32 *num_out_channels, WORD32 ch_offset) { - ia_audio_specific_config_struct *pstr_audio_specific_cfg = - &pstr_dec_data->str_frame_data.str_audio_specific_config; ia_obj_ren_dec_state_struct *pstr_obj_ren_dec_state = &pstr_dec_data->str_obj_ren_dec_state; ia_oam_dec_state_struct *pstr_obj_md_dec_state = &pstr_obj_ren_dec_state->str_obj_md_dec_state; - ia_oam_dec_config_struct *p_obj_md_cfg = &pstr_audio_specific_cfg->str_usac_config.obj_md_cfg; FLOAT32 *ptr_in_buf = &pstr_dec_data->str_usac_data.time_sample_vector[ch_offset][0]; WORD32 ccfl = pstr_dec_data->str_usac_data.output_samples; WORD32 i; @@ -1382,7 +1517,8 @@ impeghd_obj_md_dec_ren_process(ia_dec_data_struct *pstr_dec_data, FLOAT32 *ptr_o if (p_obj_md_cfg->frame_length >= ccfl) { pstr_obj_md_dec_state->sub_frame_number = 1; - impeghd_obj_renderer_dec(pstr_obj_ren_dec_state, ptr_in_buf, ptr_out_buf, ccfl); + impeghd_obj_renderer_dec(pstr_obj_ren_dec_state, p_obj_md_cfg, + ptr_in_buf, ptr_out_buf, ccfl); } else { @@ -1404,7 +1540,7 @@ impeghd_obj_md_dec_ren_process(ia_dec_data_struct *pstr_dec_data, FLOAT32 *ptr_o pstr_obj_md_dec_state->sub_frame_number = num_iter; } - impeghd_obj_renderer_dec(pstr_obj_ren_dec_state, + impeghd_obj_renderer_dec(pstr_obj_ren_dec_state, p_obj_md_cfg, ptr_in_buf + i * (p_obj_md_cfg->frame_length), ptr_out_buf + i * (p_obj_md_cfg->frame_length), ccfl); } @@ -1617,7 +1753,8 @@ impeghd_uni_drc_dec_process(ia_usac_decoder_config_struct *pstr_usac_dec_cfg, pstr_drc_dec_payload->str_select_proc.uni_drc_sel_proc_output.loud_norm_gain_db, pstr_drc_dec_payload->str_select_proc.uni_drc_sel_proc_output.boost, pstr_drc_dec_payload->str_select_proc.uni_drc_sel_proc_output.compress, - pstr_drc_dec_payload->str_select_proc.uni_drc_sel_proc_output.drc_characteristic_target); + pstr_drc_dec_payload->str_select_proc.uni_drc_sel_proc_output.drc_characteristic_target, + &pstr_asc->str_usac_config.signals_3d.inactive_signals[0]); if (err_code != IA_MPEGH_DEC_NO_ERROR) { return IA_MPEGD_DRC_EXE_FATAL_PROCESS_FAIL; @@ -1637,7 +1774,8 @@ impeghd_uni_drc_dec_process(ia_usac_decoder_config_struct *pstr_usac_dec_cfg, pstr_drc_dec_payload->str_select_proc.uni_drc_sel_proc_output.loud_norm_gain_db, pstr_drc_dec_payload->str_select_proc.uni_drc_sel_proc_output.boost, pstr_drc_dec_payload->str_select_proc.uni_drc_sel_proc_output.compress, - pstr_drc_dec_payload->str_select_proc.uni_drc_sel_proc_output.drc_characteristic_target); + pstr_drc_dec_payload->str_select_proc.uni_drc_sel_proc_output.drc_characteristic_target, + &pstr_asc->str_usac_config.signals_3d.inactive_signals[0]); if (err_code) return IA_MPEGD_DRC_EXE_FATAL_PROCESS_FAIL; } @@ -1663,6 +1801,7 @@ IA_ERRORCODE ia_core_coder_dec_process_frame_zero(VOID *temp_handle, WORD32 *num WORD32 suitable_tracks = 1, delay, grp, channel, ele_idx, num_signals, drc_effect_type, num_elements; WORD32 ch_cnt = 0, sig_grp = 0, target_loudness, loudness_norm_flag, mct_cnt = 0; + WORD32 obj_grp_idx = 0; ia_mpegh_dec_api_struct *handle = (ia_mpegh_dec_api_struct *)temp_handle; ia_mpegh_dec_state_struct *mpegh_dec_handle = handle->p_state_mpeghd; @@ -1760,16 +1899,11 @@ IA_ERRORCODE ia_core_coder_dec_process_frame_zero(VOID *temp_handle, WORD32 *num { memset(&pstr_dec_data->str_obj_ren_dec_state.str_obj_md_dec_state, 0, sizeof(pstr_dec_data->str_obj_ren_dec_state.str_obj_md_dec_state)); - memset(&pstr_dec_data->str_frame_data.str_audio_specific_config.str_usac_config.obj_md_cfg + memset(&pstr_dec_data->str_frame_data.str_audio_specific_config.str_usac_config.obj_md_cfg[obj_grp_idx] .is_screen_rel_obj[0], 0, sizeof(pstr_dec_data->str_frame_data.str_audio_specific_config.str_usac_config - .obj_md_cfg.is_screen_rel_obj)); + .obj_md_cfg[obj_grp_idx].is_screen_rel_obj)); - pstr_dec_data->str_obj_ren_dec_state.str_obj_md_dec_state.p_obj_md_cfg = - &pstr_dec_data->str_frame_data.str_audio_specific_config.str_usac_config.obj_md_cfg; - pstr_dec_data->str_obj_ren_dec_state.str_obj_md_dec_state.num_objects = - pstr_dec_data->str_frame_data.str_audio_specific_config.str_usac_config.signals_3d - .num_audio_obj; pstr_dec_data->str_obj_ren_dec_state.pstr_local_setup = &pstr_dec_data->str_local_setup_interaction; err_code = impeghd_obj_renderer_dec_init( @@ -1785,6 +1919,7 @@ IA_ERRORCODE ia_core_coder_dec_process_frame_zero(VOID *temp_handle, WORD32 *num oam_present = 1; *num_channel_out = pstr_dec_data->str_obj_ren_dec_state.num_cicp_speakers; } + obj_grp_idx++; } break; case ID_MPEGH_EXT_ELE_HOA: @@ -1950,6 +2085,9 @@ IA_ERRORCODE ia_core_coder_dec_ext_ele_proc(VOID *temp_handle, WORD32 *num_chann { IA_ERRORCODE err_code = IA_MPEGH_DEC_NO_ERROR; WORD32 channel, ele, s, num_elements, ch_offset, num_samples_out; + WORD32 obj_grp_idx = 0; + UWORD32 grp_idx = 0; + WORD32 obj_sub_frm_off = 0, obj_start = 0; ia_mpegh_dec_api_struct *handle = (ia_mpegh_dec_api_struct *)temp_handle; ia_mpegh_dec_state_struct *mpegh_dec_handle = handle->p_state_mpeghd; @@ -1985,15 +2123,14 @@ IA_ERRORCODE ia_core_coder_dec_ext_ele_proc(VOID *temp_handle, WORD32 *num_chann { ia_audio_specific_config_struct *pstr_audio_specific_cfg = &pstr_dec_data->str_frame_data.str_audio_specific_config; - ia_oam_dec_state_struct *pstr_obj_md_dec_state = - &pstr_dec_data->str_obj_ren_dec_state.str_obj_md_dec_state; ia_bit_buf_struct bit_buf_str; + ia_oam_dec_config_struct *pstr_oam_cfg = &pstr_usac_config->obj_md_cfg[obj_grp_idx]; ia_core_coder_create_init_bit_buf(&bit_buf_str, ptr_bit_buf_base, bit_buf_size); bit_buf_str.xmpeghd_jmp_buf = pstr_dec_data->dec_bit_buf.xmpeghd_jmp_buf; pstr_dec_data->str_enh_obj_md_frame.p_enh_obj_md_cfg = &pstr_audio_specific_cfg->str_usac_config.enh_obj_md_cfg; err_code = impeghd_enh_obj_md_frame(&pstr_dec_data->str_enh_obj_md_frame, &bit_buf_str, - pstr_obj_md_dec_state->num_objects, + pstr_oam_cfg->num_objects, pstr_dec_data->str_usac_data.usac_independency_flg); if (err_code != IA_MPEGH_DEC_NO_ERROR) { @@ -2006,14 +2143,20 @@ IA_ERRORCODE ia_core_coder_dec_ext_ele_proc(VOID *temp_handle, WORD32 *num_chann { WORD32 ccfl = pstr_dec_data->str_usac_data.output_samples; ia_bit_buf_struct bit_buf_str; + ia_oam_dec_config_struct *pstr_oam_cfg = &pstr_usac_config->obj_md_cfg[obj_grp_idx]; ia_core_coder_create_init_bit_buf(&bit_buf_str, ptr_bit_buf_base, bit_buf_size); bit_buf_str.xmpeghd_jmp_buf = pstr_dec_data->dec_bit_buf.xmpeghd_jmp_buf; - if (bit_buf_size > 0) + while((ia_signals_3da->group_type[grp_idx] != SIG_GROUP_TYPE_OBJ) && + (grp_idx < (WORD32)ia_signals_3da->num_sig_group)) + { + grp_idx++; + } + if (bit_buf_size > 0 && (ia_signals_3da->inactive_signal_grp[grp_idx] == 0)) { ia_audio_specific_config_struct *pstr_audio_specific_cfg = &pstr_dec_data->str_frame_data.str_audio_specific_config; ia_oam_dec_config_struct *p_obj_md_cfg = - &pstr_audio_specific_cfg->str_usac_config.obj_md_cfg; + &pstr_audio_specific_cfg->str_usac_config.obj_md_cfg[obj_grp_idx]; ia_obj_ren_dec_state_struct *pstr_obj_ren_dec_state = &pstr_dec_data->str_obj_ren_dec_state; ia_oam_dec_state_struct *pstr_obj_md_dec_state = @@ -2025,6 +2168,8 @@ IA_ERRORCODE ia_core_coder_dec_ext_ele_proc(VOID *temp_handle, WORD32 *num_chann return IA_MPEGH_OAM_EXE_FATAL_UNSUPPORTED_FRAMELENGTH; } + pstr_obj_md_dec_state->obj_sub_frm_off = obj_sub_frm_off; + pstr_obj_md_dec_state->obj_start = obj_start; if (p_obj_md_cfg->frame_length < ccfl) { WORD32 sub_frm; @@ -2037,7 +2182,7 @@ IA_ERRORCODE ia_core_coder_dec_ext_ele_proc(VOID *temp_handle, WORD32 *num_chann if (pstr_obj_md_dec_state->sub_frame_obj_md_present[sub_frm]) { pstr_obj_md_dec_state->sub_frame_number++; - err_code = impeghd_obj_md_dec(pstr_obj_md_dec_state, &bit_buf_str); + err_code = impeghd_obj_md_dec(pstr_obj_md_dec_state, pstr_oam_cfg, &bit_buf_str); if (err_code != IA_MPEGH_DEC_NO_ERROR) { return err_code; @@ -2048,13 +2193,17 @@ IA_ERRORCODE ia_core_coder_dec_ext_ele_proc(VOID *temp_handle, WORD32 *num_chann else { pstr_obj_md_dec_state->sub_frame_number = 1; - err_code = impeghd_obj_md_dec(pstr_obj_md_dec_state, &bit_buf_str); + err_code = impeghd_obj_md_dec(pstr_obj_md_dec_state, p_obj_md_cfg, &bit_buf_str); if (err_code != IA_MPEGH_DEC_NO_ERROR) { return err_code; } } + obj_sub_frm_off += p_obj_md_cfg->num_objects * pstr_obj_md_dec_state->sub_frame_number; + obj_start += p_obj_md_cfg->num_objects; } + grp_idx++; + obj_grp_idx = obj_grp_idx + 1; break; } } @@ -2095,17 +2244,7 @@ IA_ERRORCODE ia_core_coder_dec_ext_ele_proc(VOID *temp_handle, WORD32 *num_chann handle->mpeghd_config.pcm_data_length = 3 * AUDIO_CODEC_FRAME_SIZE_MAX * num_cc_channels; } - if (pstr_dec_data->str_frame_data.str_audio_specific_config.str_mae_asi.asi_present) - { - err_code = impeghd_mdp_dec_process( - &pstr_dec_data->str_frame_data.str_audio_specific_config, pstr_dec_data, - pstr_dec_data->str_frame_data.str_audio_specific_config.channel_configuration, - (FLOAT32 *)(mpegh_dec_handle->mpeghd_scratch_mem_v), handle->mpeghd_config.i_preset_id); - if (err_code != IA_MPEGH_DEC_NO_ERROR) - { - return err_code; - } - } + for (ele = 0; ele < num_elements; ele++) { if ((ID_EXT_ELE_UNI_DRC == pstr_usac_dec_cfg->ia_ext_ele_payload_type[ele]) && @@ -2152,6 +2291,35 @@ IA_ERRORCODE ia_core_coder_dec_ext_ele_proc(VOID *temp_handle, WORD32 *num_chann } } + obj_grp_idx = 0; + grp_idx = 0; + ch_offset = 0; + obj_sub_frm_off = 0; + obj_start = 0; + for (grp_idx = 0; grp_idx < ia_signals_3da->num_sig_group; grp_idx++) + { + if (ia_signals_3da->group_type[grp_idx] == SIG_GROUP_TYPE_CHN && ia_signals_3da->inactive_signal_grp[grp_idx] == 0) + { + if (ia_signals_3da->num_sig[grp_idx] > 0) + { + if (ch_offset > 0) + { + for (channel = 0; channel < *num_channel_out; channel++) + { + for (s = 0; s < num_samples_out; s++) + { + pstr_dec_data->str_usac_data.time_sample_vector[channel][s] = + ia_add_flt(pstr_dec_data->str_usac_data.time_sample_vector[channel][s], + pstr_dec_data->str_usac_data.time_sample_vector[channel + ch_offset][s]); + } + } + } + ch_offset += ia_signals_3da->num_sig[grp_idx]; + } + } + } + ch_offset = 0; + grp_idx = 0; for (ele = 0; ele < num_elements; ele++) { if (pstr_usac_dec_cfg->usac_ext_ele_payload_present[ele]) @@ -2160,12 +2328,35 @@ IA_ERRORCODE ia_core_coder_dec_ext_ele_proc(VOID *temp_handle, WORD32 *num_chann { case ID_MPEGH_EXT_ELE_OAM: { + ia_oam_dec_config_struct *p_obj_md_cfg = &pstr_usac_config->obj_md_cfg[obj_grp_idx]; + ia_oam_dec_state_struct *p_str_obj_ren_dec_state = &pstr_dec_data->str_obj_ren_dec_state.str_obj_md_dec_state; + while((ia_signals_3da->group_type[grp_idx] != SIG_GROUP_TYPE_OBJ) && + (grp_idx < (WORD32)ia_signals_3da->num_sig_group)) + { + if (ia_signals_3da->inactive_signal_grp[grp_idx] == 0) + { + ch_offset += ia_signals_3da->num_sig[grp_idx]; + } + grp_idx++; + } + if (ia_signals_3da->inactive_signal_grp[grp_idx] == 1) + { + grp_idx++; + obj_grp_idx++; + continue; + } if (ptr_out_buf == NULL) { ptr_out_buf = (FLOAT32 *)mpegh_dec_handle->mpeghd_scratch_mem_v; } - err_code = impeghd_obj_md_dec_ren_process(pstr_dec_data, ptr_out_buf, num_channel_out, + p_str_obj_ren_dec_state->obj_sub_frm_off = obj_sub_frm_off; + p_str_obj_ren_dec_state->obj_start = obj_start; + err_code = impeghd_obj_md_dec_ren_process(pstr_dec_data, p_obj_md_cfg, ptr_out_buf, num_channel_out, ch_offset); + ch_offset += ia_signals_3da->num_sig[grp_idx]; + grp_idx++; + obj_sub_frm_off += p_obj_md_cfg->num_objects * p_str_obj_ren_dec_state->sub_frame_number; + obj_start += p_obj_md_cfg->num_objects; if (err_code != IA_MPEGH_DEC_NO_ERROR) { return err_code; @@ -2193,7 +2384,6 @@ IA_ERRORCODE ia_core_coder_dec_ext_ele_proc(VOID *temp_handle, WORD32 *num_chann ptr_out_buf[channel * num_samples_out + s]); } } - ch_offset += pstr_usac_config->signals_3d.num_audio_obj; } else if (pstr_usac_config->signals_3d.num_hoa_transport_ch != 0) { @@ -2213,10 +2403,11 @@ IA_ERRORCODE ia_core_coder_dec_ext_ele_proc(VOID *temp_handle, WORD32 *num_chann } } } - ch_offset += pstr_usac_config->signals_3d.num_audio_obj; } else { + if ((ch_offset - ia_signals_3da->num_sig[grp_idx - 1]) == 0) + { for (channel = 0; channel < *num_channel_out; channel++) { ia_core_coder_mem_cpy(&ptr_out_buf[channel * num_samples_out], @@ -2224,7 +2415,20 @@ IA_ERRORCODE ia_core_coder_dec_ext_ele_proc(VOID *temp_handle, WORD32 *num_chann num_samples_out); } } - + else + { + for (channel = 0; channel < *num_channel_out; channel++) + { + for (s = 0; s < num_samples_out; s++) + { + pstr_dec_data->str_usac_data.time_sample_vector[channel][s] = + ia_add_flt(pstr_dec_data->str_usac_data.time_sample_vector[channel][s], + ptr_out_buf[channel * num_samples_out + s]); + } + } + } + } + obj_grp_idx++; break; } case ID_MPEGH_EXT_ELE_HOA: @@ -2373,7 +2577,7 @@ IA_ERRORCODE ia_core_coder_dec_main(VOID *temp_handle, WORD8 *inbuffer, WORD8 *o WORD32 preroll_counter = 0; WORD32 suitable_tracks = 1; WORD32 num_samples_out; - WORD32 grp, channel, s, sig, cnt, elemIdx; + WORD32 grp, channel, s, sig, elemIdx; WORD32 mhas_offset = 0; WORD32 target_loudness; WORD32 loudness_norm_flag; @@ -2405,7 +2609,11 @@ IA_ERRORCODE ia_core_coder_dec_main(VOID *temp_handle, WORD8 *inbuffer, WORD8 *o if (((pstr_asc->channel_configuration == 0) && (ia_signals_3da->num_hoa_transport_ch == 0) && (ia_signals_3da->num_audio_obj == 0)) || +#ifndef LC_LEVEL_4 (pstr_asc->channel_configuration > 16)) +#else + (pstr_asc->channel_configuration > 24)) +#endif { return IA_MPEGH_DEC_EXE_FATAL_INVALID_CHAN_CONFIG; } @@ -2431,8 +2639,13 @@ IA_ERRORCODE ia_core_coder_dec_main(VOID *temp_handle, WORD8 *inbuffer, WORD8 *o /* audio pre roll frame parsing*/ if (0 == handle->mpeghd_config.ui_raw_flag) { + WORD16 asi_present = pstr_asc->str_mae_asi.asi_present; err_code = impeghd_mhas_parse(&pac_info, &pstr_asc->str_mae_asi, &pstr_dec_data->dec_bit_buf); + if ((asi_present == 0) && (pstr_asc->str_mae_asi.asi_present == 1)) + { + (void)ia_core_code_mdp((VOID *)handle, handle->mpeghd_config.i_preset_id); + } if (err_code) { return err_code; @@ -2470,7 +2683,7 @@ IA_ERRORCODE ia_core_coder_dec_main(VOID *temp_handle, WORD8 *inbuffer, WORD8 *o (pstr_dec_data->str_drc_payload.pstr_drc_config != NULL))) { WORD32 index = 0; - for (WORD32 i = 0; i < MAX_ELEMENTS_USAC; i++) + for (WORD32 i = 0; i < MAX_NUM_ELEMENTS; i++) { if (ID_EXT_ELE_UNI_DRC == pstr_asc->str_usac_config.str_usac_dec_config.ia_ext_ele_payload_type[i]) @@ -2893,32 +3106,12 @@ IA_ERRORCODE ia_core_coder_dec_main(VOID *temp_handle, WORD8 *inbuffer, WORD8 *o ia_core_coder_samples_sat((WORD8 *)outbuffer + tot_out_bytes, num_samples_out, pcmsize, &pstr_dec_data->ptr_binaural_output[0], out_ch_map, &mpegh_dec_handle->delay_in_samples, out_bytes, *num_channel_out); - { - WORD32 payload_buffer_offeset = 0; - WORD32 copy_bytes = - pstr_dec_data->str_frame_data.str_audio_specific_config.str_usac_config - .str_usac_dec_config.usac_ext_gain_payload_len[preroll_counter] * - sizeof(WORD8); - - pstr_asc->str_usac_config.str_usac_dec_config.usac_ext_gain_payload_len[preroll_counter] = - pstr_dec_data->str_frame_data.str_audio_specific_config.str_usac_config - .str_usac_dec_config.usac_ext_gain_payload_len[preroll_counter]; - - for (cnt = 0; cnt < preroll_counter; cnt++) - { - payload_buffer_offeset += - pstr_dec_data->str_frame_data.str_audio_specific_config.str_usac_config - .str_usac_dec_config.usac_ext_gain_payload_len[cnt] * - sizeof(WORD8); - } - - pstr_asc->str_usac_config.str_usac_dec_config.preroll_bytes[preroll_counter] = *out_bytes; + pstr_asc->str_usac_config.str_usac_dec_config.preroll_bytes[preroll_counter] = *out_bytes; - preroll_counter++; + preroll_counter++; - if (preroll_counter > (MAX_AUDIO_PREROLLS + 1)) - return IA_MPEGH_DEC_EXE_FATAL_UNSUPPORTED_NUM_PRE_ROLLS; - } + if (preroll_counter > (MAX_AUDIO_PREROLLS + 1)) + return IA_MPEGH_DEC_EXE_FATAL_UNSUPPORTED_NUM_PRE_ROLLS; access_units++; preroll_units--; diff --git a/decoder/ia_core_coder_definitions.h b/decoder/ia_core_coder_definitions.h index 6f2262b..591d512 100644 --- a/decoder/ia_core_coder_definitions.h +++ b/decoder/ia_core_coder_definitions.h @@ -49,14 +49,20 @@ #define MAX_PREROLL_FRAMES (1) #define MAX_OUTPUT_PCM_SIZE (4) -#define MAX_USAC_CH (24) +#ifdef LC_LEVEL_4 +#define MAX_USAC_CH (56) +#else +#define MAX_USAC_CH (32) +#endif +#define MAX_LOUD_SPEAKERS (24) #define MAX_OUT_SAMPLES_PER_FRAME (1024) +#define MAX_USAC_ELEMENTS ((MAX_USAC_CH << 1) + (MAX_USAC_CH >> 1)) #define SAMPLES_PER_FRAME (1024) -#define IN_BUF_SIZE (768 * MAX_USAC_CH + 128) +#define IN_BUF_SIZE (768 * MAX_USAC_ELEMENTS + 128) #define MAX_RESAMPLER_RATIO (2) #define OUT_BUF_SIZE \ - (MAX_USAC_CH * MAX_PREROLL_FRAMES * MAX_OUT_SAMPLES_PER_FRAME * MAX_OUTPUT_PCM_SIZE * \ + (MAX_LOUD_SPEAKERS * MAX_PREROLL_FRAMES * MAX_OUT_SAMPLES_PER_FRAME * MAX_OUTPUT_PCM_SIZE * \ MAX_RESAMPLER_RATIO) #endif /* IA_CORE_CODER_DEFINITIONS_H */ diff --git a/decoder/ia_core_coder_headerdecode.c b/decoder/ia_core_coder_headerdecode.c index c34b318..fac4b8f 100644 --- a/decoder/ia_core_coder_headerdecode.c +++ b/decoder/ia_core_coder_headerdecode.c @@ -221,4 +221,36 @@ IA_ERRORCODE ia_core_coder_headerdecode(ia_mpegh_dec_api_struct *p_obj_mpegh_dec } return IA_MPEGH_DEC_NO_ERROR; } + +/** + * ia_core_coder_search_asi + * + * \brief Search for ASI packet in the input stream. + * + * \param [in] handle Decoder api handle + * \param [in] buffer Input bit buffer stream + * \param [in] buffer_len Length of input buffer in bytes + * + * \return IA_ERRORCODE + * + */ +IA_ERRORCODE ia_core_coder_search_asi(VOID *handle, UWORD8 *buffer, + WORD32 buffer_len) +{ + ia_mpegh_dec_api_struct *p_obj_mpegh_dec = (ia_mpegh_dec_api_struct *)handle; + ia_mhas_pac_info info; + struct ia_bit_buf_struct it_bit_buff = {0}, *handle_bit_buff; + ia_mpegh_dec_state_struct *mpeghd_state_struct = p_obj_mpegh_dec->pp_mem_mpeghd[PERSIST_IDX]; + ia_audio_specific_config_struct *pstr_asc = + (ia_audio_specific_config_struct *)mpeghd_state_struct->ia_audio_specific_config; + handle_bit_buff = + ia_core_coder_create_bit_buf(&it_bit_buff, (UWORD8 *)buffer, (WORD16)buffer_len); + if (handle_bit_buff->cnt_bits <= 0) + { + return 0; + } + handle_bit_buff->cnt_bits += (buffer_len << 3); + impeghd_mhas_parse(&info, &pstr_asc->str_mae_asi, handle_bit_buff); + return 0; +} /** @} */ /* End of CoreDecConfParse */ \ No newline at end of file diff --git a/decoder/ia_core_coder_init_config.c b/decoder/ia_core_coder_init_config.c index c32dbc1..02d4f26 100644 --- a/decoder/ia_core_coder_init_config.c +++ b/decoder/ia_core_coder_init_config.c @@ -187,6 +187,8 @@ VOID ia_core_coder_read_escape_value(ia_bit_buf_struct *it_bit_buff, UWORD32 *ex * \param [in,out] ia_ext_ele_payload_type Extension payload type * \param [in] pstr_usac_conf USAC config structure * \param [in] ccfl Frame Length + * \param [in] elem_idx Syntactic element index + * \param [in,out] obj_grp_idx Pointer to object group index value * * \return IA_ERRORCODE * @@ -195,16 +197,16 @@ IA_ERRORCODE ia_core_coder_ext_element_config( ia_bit_buf_struct *it_bit_buff, ia_usac_dec_element_config_struct *pstr_usac_element_config, UWORD8 *ptr_usac_ext_ele_payload, WORD32 *ptr_usac_ext_ele_payload_len, WORD32 *preroll_flag, WORD32 *ia_ext_ele_payload_type, ia_usac_config_struct *pstr_usac_conf, WORD32 ccfl, - WORD32 elem_idx) + WORD32 elem_idx, WORD32 *obj_grp_idx) { IA_ERRORCODE err_code = IA_MPEGH_DEC_NO_ERROR; WORD32 cnt_bits, skip_bits; UWORD32 usac_ext_element_type, usac_ext_element_config_length, flag; UWORD32 i; UWORD32 num_aud_preroll = 0, num_uni_drc = 0; - ia_oam_dec_config_struct *p_obj_md_cfg = &pstr_usac_conf->obj_md_cfg; + ia_oam_dec_config_struct *p_obj_md_cfg = &pstr_usac_conf->obj_md_cfg[*obj_grp_idx]; ia_hoa_config_struct *pstr_hoa_config = &pstr_usac_conf->str_usac_dec_config.str_hoa_config; - WORD32 num_objects = pstr_usac_conf->signals_3d.num_audio_obj; + WORD32 num_objects = pstr_usac_conf->signals_3d.num_grp_objs[*obj_grp_idx]; ia_core_coder_read_escape_value(it_bit_buff, &(usac_ext_element_type), 4, 8, 16); *ia_ext_ele_payload_type = usac_ext_element_type; @@ -305,6 +307,7 @@ IA_ERRORCODE ia_core_coder_ext_element_config( { *ptr_usac_ext_ele_payload_len = usac_ext_element_config_length; cnt_bits = it_bit_buff->cnt_bits; + p_obj_md_cfg->num_objects = num_objects; impeghd_obj_md_cfg(p_obj_md_cfg, it_bit_buff, ccfl, num_objects); cnt_bits = cnt_bits - it_bit_buff->cnt_bits; if (cnt_bits > (WORD32)(usac_ext_element_config_length << 3)) @@ -316,6 +319,7 @@ IA_ERRORCODE ia_core_coder_ext_element_config( skip_bits = (usac_ext_element_config_length << 3) - cnt_bits; ia_core_coder_skip_bits_buf(it_bit_buff, skip_bits); } + *obj_grp_idx = *obj_grp_idx + 1; break; } case ID_EXT_ELE_UNI_DRC: @@ -560,11 +564,12 @@ static IA_ERRORCODE ia_core_coder_decoder_config(ia_bit_buf_struct *it_bit_buff, IA_ERRORCODE err = IA_MPEGH_DEC_NO_ERROR; UWORD32 elem_idx = 0, sbr_ratio_index = 0; WORD32 index = 0; + WORD32 obj_grp_idx = 0; ia_usac_decoder_config_struct *pstr_usac_decoder_config; ia_usac_dec_element_config_struct *pstr_usac_element_config; pstr_usac_decoder_config = &pstr_usac_conf->str_usac_dec_config; memset(pstr_usac_decoder_config->num_output_chns, -1, - MAX_ELEMENTS_USAC * sizeof(pstr_usac_decoder_config->num_output_chns[0])); + MAX_NUM_ELEMENTS * sizeof(pstr_usac_decoder_config->num_output_chns[0])); ia_core_coder_read_escape_value(it_bit_buff, &(pstr_usac_decoder_config->num_elements), 4, 8, 16); @@ -572,7 +577,7 @@ static IA_ERRORCODE ia_core_coder_decoder_config(ia_bit_buf_struct *it_bit_buff, pstr_usac_decoder_config->preroll_flag = 0; pstr_usac_decoder_config->num_elements += 1; - if (pstr_usac_decoder_config->num_elements > MAX_ELEMENTS_USAC) + if (pstr_usac_decoder_config->num_elements > MAX_NUM_ELEMENTS) { return IA_MPEGH_DEC_EXE_FATAL_DECODE_FRAME_ERROR; } @@ -597,7 +602,7 @@ static IA_ERRORCODE ia_core_coder_decoder_config(ia_bit_buf_struct *it_bit_buff, &pstr_usac_decoder_config->usac_ext_ele_payload_len[elem_idx], &(pstr_usac_decoder_config->preroll_flag), &pstr_usac_decoder_config->ia_ext_ele_payload_type[elem_idx], pstr_usac_conf, 1024, - elem_idx); + elem_idx, &obj_grp_idx); if (err != IA_MPEGH_DEC_NO_ERROR) { @@ -1385,8 +1390,9 @@ IA_ERRORCODE ia_core_coder_mpegh_3da_config(ia_bit_buf_struct *it_bit_buff, } pstr_usac_conf->str_usac_dec_config.str_hoa_config.core_coder_frame_length = AUDIO_CODEC_FRAME_SIZE_MAX; // Hardcoded in ref code. - num_hoa_based_grps++; + ia_signals_3da->num_grp_tc[num_hoa_based_grps] = (num_sig + 1); ia_signals_3da->num_hoa_transport_ch += (num_sig + 1); + num_hoa_based_grps++; pstr_usac_conf->str_usac_dec_config.str_hoa_config.num_transport_ch = ia_signals_3da->num_hoa_transport_ch; break; @@ -1404,6 +1410,7 @@ IA_ERRORCODE ia_core_coder_mpegh_3da_config(ia_bit_buf_struct *it_bit_buff, return IA_MPEGH_DEC_INIT_FATAL_STREAM_CHAN_GT_MAX; } ia_signals_3da->num_audio_obj += (num_sig + 1); + ia_signals_3da->num_grp_objs[num_obj_based_grps] = (num_sig + 1); num_obj_based_grps++; break; } @@ -1552,17 +1559,17 @@ IA_ERRORCODE ia_core_coder_mpegh_3da_config(ia_bit_buf_struct *it_bit_buff, if (pstr_usac_element_config->noise_filling != 0 || pstr_usac_element_config->enhanced_noise_filling != 0) { - return IA_MPEGH_DEC_INIT_FATAL_INVALID_PROFILE_CONFIG; + //return IA_MPEGH_DEC_INIT_FATAL_INVALID_PROFILE_CONFIG; } break; case ID_USAC_EXT: if (pstr_usac_decoder_config->ia_ext_ele_payload_type[elem_idx] == ID_MPEGH_EXT_ELE_MCT) { - return IA_MPEGH_DEC_INIT_FATAL_INVALID_PROFILE_CONFIG; + //return IA_MPEGH_DEC_INIT_FATAL_INVALID_PROFILE_CONFIG; } break; default: - return IA_MPEGH_DEC_INIT_FATAL_INVALID_PROFILE_CONFIG; + //return IA_MPEGH_DEC_INIT_FATAL_INVALID_PROFILE_CONFIG; break; } } @@ -1682,7 +1689,7 @@ IA_ERRORCODE ia_core_coder_mpegh_3da_config(ia_bit_buf_struct *it_bit_buff, break; #endif default: - return IA_MPEGH_DEC_INIT_FATAL_UNSUPPORTED_MPEGH_PROFILE; + //return IA_MPEGH_DEC_INIT_FATAL_UNSUPPORTED_MPEGH_PROFILE; break; } if ((mpegh_profile_lvl >= MPEGH_PROFILE_BP_LVL_1 && mpegh_profile_lvl <= MPEGH_PROFILE_BP_LVL_3) && @@ -1708,7 +1715,7 @@ VOID ia_core_coder_conf_default(ia_usac_config_struct *pstr_usac_conf) { WORD32 ele; - for (ele = 0; ele < MAX_ELEMENTS_USAC; ele++) + for (ele = 0; ele < MAX_NUM_ELEMENTS; ele++) pstr_usac_conf->str_usac_dec_config.usac_element_type[ele] = ID_USAC_INVALID; pstr_usac_conf->str_usac_dec_config.num_elements = 0; diff --git a/decoder/ia_core_coder_interface.h b/decoder/ia_core_coder_interface.h index 2954a6c..2339586 100644 --- a/decoder/ia_core_coder_interface.h +++ b/decoder/ia_core_coder_interface.h @@ -58,6 +58,10 @@ enum LEN_PC_COMM = 8, }; +IA_ERRORCODE ia_core_coder_search_asi(VOID *handle, UWORD8 *buffer, + WORD32 buffer_len); +IA_ERRORCODE ia_core_code_mdp(VOID *handle, WORD32 preset_id); + IA_ERRORCODE ia_core_coder_dec_main(VOID *handle, WORD8 *inbuffer, WORD8 *outbuffer, WORD32 *out_bytes, WORD32 frames_done, WORD32 pcmsize, WORD32 *num_channel_out); diff --git a/decoder/ia_core_coder_process.c b/decoder/ia_core_coder_process.c index 567b074..4d4214c 100644 --- a/decoder/ia_core_coder_process.c +++ b/decoder/ia_core_coder_process.c @@ -788,6 +788,7 @@ IA_ERRORCODE ia_core_coder_usac_process(ia_dec_data_struct *pstr_dec_data, VOID ia_usac_config_struct *pstr_usac_config = &(fd->str_audio_specific_config.str_usac_config); ia_usac_decoder_config_struct *pstr_usac_dec_config = &(fd->str_audio_specific_config.str_usac_config.str_usac_dec_config); + UWORD32 *ptr_inactive_signal = &pstr_usac_config->signals_3d.inactive_signals[0]; WORD16 nr_core_coder_channels = 0; WORD32 ch_offset = 0; @@ -797,7 +798,7 @@ IA_ERRORCODE ia_core_coder_usac_process(ia_dec_data_struct *pstr_dec_data, VOID WORD32 num_elements = pstr_usac_dec_config->num_elements; ia_usac_tmp_core_coder_struct str_tmp_core_coder[MAX_NUM_CHANNELS] = {{0}}; ia_usac_tmp_core_coder_struct *pstr_core_coder; - WORD32 ch_cnt = 0; + WORD32 ch_cnt = 0, tot_chan = 0; WORD32 sig_group, i; pstr_usac_data->is_base_line_profile_3b = p_state_mpegh_dec->is_base_line_profile_3b; @@ -812,22 +813,31 @@ IA_ERRORCODE ia_core_coder_usac_process(ia_dec_data_struct *pstr_dec_data, VOID for (elem_idx = 0; elem_idx < num_elements; elem_idx++) { + WORD16 tmp = 0; WORD32 stereo_config_index = pstr_usac_config->str_usac_dec_config.str_usac_element_config[elem_idx] .stereo_config_index; switch (ele_id = pstr_usac_dec_config->usac_element_type[elem_idx]) { case ID_USAC_SCE: + if (pstr_usac_dec_config->ele_length_present == 1) + { + //ia_core_coder_skip_bits_buf(it_bit_buff, 16); + tmp = ia_core_coder_read_bits_buf(it_bit_buff, 16); + if (ptr_inactive_signal[tot_chan]) + { + ia_core_coder_skip_bits_buf(it_bit_buff, tmp); + tot_chan++; + break; + } + tot_chan++; + } nr_core_coder_channels = 1; num_ch_out += 1; - if ((ch_offset >= MAX_NUM_CHANNELS_USAC_LVL2) || (num_ch_out > MAX_NUM_CHANNELS_USAC_LVL2)) + if ((ch_offset >= MAX_NUM_CHANNELS) || (num_ch_out > MAX_NUM_CHANNELS)) return IA_MPEGH_DEC_EXE_FATAL_UNSUPPORTED_NUM_CHANNELS; - if (pstr_usac_dec_config->ele_length_present == 1) - { - ia_core_coder_skip_bits_buf(it_bit_buff, 16); - } pstr_core_coder = &str_tmp_core_coder[ch_cnt]; err = ia_core_coder_data(ele_id, pstr_usac_data, elem_idx, ch_offset, it_bit_buff, nr_core_coder_channels, pstr_usac_dec_config, pstr_core_coder); @@ -839,6 +849,18 @@ IA_ERRORCODE ia_core_coder_usac_process(ia_dec_data_struct *pstr_dec_data, VOID break; case ID_USAC_CPE: + if (pstr_usac_dec_config->ele_length_present == 1) + { + tmp = ia_core_coder_read_bits_buf(it_bit_buff, 16); + if (ptr_inactive_signal[tot_chan]) + { + ia_core_coder_skip_bits_buf(it_bit_buff, tmp); + tot_chan += 2; + break; + } + tot_chan += 2; + } + if (1 == stereo_config_index) { nr_core_coder_channels = 1; @@ -850,13 +872,9 @@ IA_ERRORCODE ia_core_coder_usac_process(ia_dec_data_struct *pstr_dec_data, VOID num_ch_out += 2; - if ((ch_offset >= MAX_NUM_CHANNELS_USAC_LVL2) || (num_ch_out > MAX_NUM_CHANNELS_USAC_LVL2)) + if ((ch_offset >= MAX_NUM_CHANNELS) || (num_ch_out > MAX_NUM_CHANNELS)) return IA_MPEGH_DEC_EXE_FATAL_UNSUPPORTED_NUM_CHANNELS; - if (pstr_usac_dec_config->ele_length_present == 1) - { - ia_core_coder_skip_bits_buf(it_bit_buff, 16); - } pstr_core_coder = &str_tmp_core_coder[ch_cnt]; err = ia_core_coder_data(ele_id, pstr_usac_data, elem_idx, ch_offset, it_bit_buff, nr_core_coder_channels, pstr_usac_dec_config, pstr_core_coder); @@ -868,16 +886,23 @@ IA_ERRORCODE ia_core_coder_usac_process(ia_dec_data_struct *pstr_dec_data, VOID break; case ID_USAC_LFE: + if (pstr_usac_dec_config->ele_length_present == 1) + { + tmp = ia_core_coder_read_bits_buf(it_bit_buff, 16); + if (ptr_inactive_signal[tot_chan]) + { + ia_core_coder_skip_bits_buf(it_bit_buff, tmp); + tot_chan += 1; + break; + } + tot_chan += 1; + } nr_core_coder_channels = 1; num_ch_out += 1; - if ((ch_offset >= MAX_NUM_CHANNELS_USAC_LVL2) || (num_ch_out > MAX_NUM_CHANNELS_USAC_LVL2)) + if ((ch_offset >= MAX_NUM_CHANNELS) || (num_ch_out > MAX_NUM_CHANNELS)) return IA_MPEGH_DEC_EXE_FATAL_UNSUPPORTED_NUM_CHANNELS; - if (pstr_usac_dec_config->ele_length_present == 1) - { - ia_core_coder_skip_bits_buf(it_bit_buff, 16); - } pstr_core_coder = &str_tmp_core_coder[ch_cnt]; err = ia_core_coder_data(ele_id, pstr_usac_data, elem_idx, ch_offset, it_bit_buff, nr_core_coder_channels, pstr_usac_dec_config, pstr_core_coder); @@ -914,6 +939,12 @@ IA_ERRORCODE ia_core_coder_usac_process(ia_dec_data_struct *pstr_dec_data, VOID { if (pstr_usac_dec_config->ia_ext_ele_payload_type[elem_idx] == ID_MPEGH_EXT_ELE_MCT) { + WORD32 ch_start = pstr_usac_dec_config->ia_mcdata[mct_cnt].start_channel; + if (pstr_usac_config->signals_3d.inactive_signals[ch_start] == 1) + { + mct_cnt++; + continue; + } err = impeghd_mc_parse(&pstr_usac_dec_config->ia_mcdata[mct_cnt], pstr_usac_dec_config->usac_ext_gain_payload_buf[elem_idx], pstr_usac_dec_config->usac_ext_gain_payload_len[elem_idx], @@ -933,6 +964,11 @@ IA_ERRORCODE ia_core_coder_usac_process(ia_dec_data_struct *pstr_dec_data, VOID } for (sig_group = 0; sig_group < mct_cnt; sig_group++) { + WORD32 ch_start = pstr_usac_dec_config->ia_mcdata[sig_group].start_channel; + if (pstr_usac_config->signals_3d.inactive_signals[ch_start] == 1) + { + continue; + } for (i = 0; i < pstr_usac_dec_config->ia_mcdata[sig_group].num_pairs; i++) { WORD32 mct_band_offset = 0, mct_bands_per_win; @@ -1079,6 +1115,11 @@ IA_ERRORCODE ia_core_coder_usac_process(ia_dec_data_struct *pstr_dec_data, VOID { ia_multichannel_data *mct = &pstr_usac_dec_config->ia_mcdata[sig_group]; WORD32 ch; + WORD32 ch_start = pstr_usac_dec_config->ia_mcdata[sig_group].start_channel; + if (pstr_usac_config->signals_3d.inactive_signals[ch_start] == 1) + { + continue; + } for (ch = 0; ch < mct->num_ch_to_apply; ch++) { const WORD32 chIdx = mct->channel_map[ch + mct->start_channel]; @@ -1093,6 +1134,7 @@ IA_ERRORCODE ia_core_coder_usac_process(ia_dec_data_struct *pstr_dec_data, VOID ch_cnt = 0; ch_offset = 0; + tot_chan = 0; /* process elements */ for (elem_idx = 0; elem_idx < num_elements; elem_idx++) { @@ -1105,6 +1147,12 @@ IA_ERRORCODE ia_core_coder_usac_process(ia_dec_data_struct *pstr_dec_data, VOID { case ID_USAC_SCE: case ID_USAC_LFE: + if (ptr_inactive_signal[tot_chan]) + { + tot_chan += 1; + break; + } + tot_chan += 1; pstr_core_coder = &str_tmp_core_coder[ch_cnt]; err = ia_core_coder_data_process(pstr_usac_data, elem_idx, ch_offset, 1, pstr_core_coder); @@ -1114,6 +1162,12 @@ IA_ERRORCODE ia_core_coder_usac_process(ia_dec_data_struct *pstr_dec_data, VOID ch_cnt++; break; case ID_USAC_CPE: + if (ptr_inactive_signal[tot_chan]) + { + tot_chan += 2; + break; + } + tot_chan += 2; if (1 == stereo_config_index) { num_ch_per_ele = 1; diff --git a/decoder/ia_core_coder_spectrum_dec.c b/decoder/ia_core_coder_spectrum_dec.c index 327048a..74208b7 100644 --- a/decoder/ia_core_coder_spectrum_dec.c +++ b/decoder/ia_core_coder_spectrum_dec.c @@ -199,7 +199,7 @@ IA_ERRORCODE ia_core_coder_read_tns_tcx(WORD32 sfb_per_sbk, top - ia_core_coder_read_bits_buf(it_bit_buff, TNS_SHORT_START_BAND_BITS); if (top <= 0) { - return IA_MPEGH_DEC_EXE_FATAL_INVALID_START_BAND; + //return IA_MPEGH_DEC_EXE_FATAL_INVALID_START_BAND; } pstr_tns_filt->order = ia_core_coder_read_bits_buf(it_bit_buff, TNS_SHORT_ORDER_BITS); @@ -292,7 +292,7 @@ IA_ERRORCODE ia_core_coder_read_tns_u(ia_sfb_info_struct *ptr_sfb_info, top - ia_core_coder_read_bits_buf(it_bit_buff, start_band_bits); if (top <= 0) { - return IA_MPEGH_DEC_EXE_FATAL_INVALID_START_BAND; + //return IA_MPEGH_DEC_EXE_FATAL_INVALID_START_BAND; } pstr_tns_filt->order = ia_core_coder_read_bits_buf(it_bit_buff, order_bits); diff --git a/decoder/impd_drc_process.c b/decoder/impd_drc_process.c index 75428e4..0d96d38 100644 --- a/decoder/impd_drc_process.c +++ b/decoder/impd_drc_process.c @@ -61,6 +61,7 @@ * \param [in] pstr_drc_instruction_arr Pointer to instructions structure * \param [in] impd_apply_gains apply gain flag * \param [in] sel_drc_idx drc index + * \param [in] ptr_inactive_sig Pointer to active signal information. * * * @@ -68,7 +69,8 @@ static VOID impd_drc_apply_gains_and_add(ia_drc_gain_dec_struct *pstr_drc_gain_dec, FLOAT32 *channel_audio[], ia_drc_instructions_struct *pstr_drc_instruction_arr, - WORD32 impd_apply_gains, WORD32 sel_drc_idx) + WORD32 impd_apply_gains, WORD32 sel_drc_idx, + UWORD32 *ptr_inactive_sig) { ia_drc_params_struct *pstr_ia_drc_params = &pstr_drc_gain_dec->ia_drc_params_struct; ia_drc_gain_buffer_struct *pstr_gain_buf = @@ -84,6 +86,7 @@ static VOID impd_drc_apply_gains_and_add(ia_drc_gain_dec_struct *pstr_drc_gain_d FLOAT32 *lpcm_gain; FLOAT32 **deinterleaved_audio = pstr_drc_gain_dec->audio_band_buffer.non_interleaved_audio; ia_drc_instructions_struct *pstr_drc_instruction = &(pstr_drc_instruction_arr[drc_instrns_idx]); + WORD32 ch_offset = 0; if (0 <= drc_instrns_idx) { @@ -121,8 +124,8 @@ static VOID impd_drc_apply_gains_and_add(ia_drc_gain_dec_struct *pstr_drc_gain_d } } - for (num_ch_grp = pstr_drc_instruction->num_drc_ch_groups - 1; num_ch_grp >= 0; - num_ch_grp--) + for (num_ch_grp = 0; num_ch_grp < pstr_drc_instruction->num_drc_ch_groups; + num_ch_grp++) { for (num_band = pstr_drc_instruction->band_count_of_ch_group[num_ch_grp] - 1; num_band >= 0; num_band--) @@ -136,15 +139,21 @@ static VOID impd_drc_apply_gains_and_add(ia_drc_gain_dec_struct *pstr_drc_gain_d if (1 != impd_apply_gains) { + ch_offset = 0; for (num_ch = pstr_ia_drc_params->channel_offset; num_ch < pstr_ia_drc_params->channel_offset + pstr_ia_drc_params->num_ch_process; num_ch++) { + if (ptr_inactive_sig[num_ch]) + { + ch_offset++; + continue; + } if (num_ch_grp == pstr_drc_instruction->channel_group_of_ch[num_ch]) { - sig_idx = sig_idx_ch[num_ch] + num_band; + sig_idx = sig_idx_ch[num_ch] + num_band - ch_offset; for (fr_size = pstr_ia_drc_params->drc_frame_size - 1; fr_size >= 0; fr_size--) @@ -156,15 +165,21 @@ static VOID impd_drc_apply_gains_and_add(ia_drc_gain_dec_struct *pstr_drc_gain_d } else { + ch_offset = 0; for (num_ch = pstr_ia_drc_params->channel_offset; num_ch < pstr_ia_drc_params->channel_offset + pstr_ia_drc_params->num_ch_process; num_ch++) { + if (ptr_inactive_sig[num_ch]) + { + ch_offset++; + continue; + } if (num_ch_grp == pstr_drc_instruction->channel_group_of_ch[num_ch]) { - sig_idx = sig_idx_ch[num_ch] + num_band; + sig_idx = sig_idx_ch[num_ch] + num_band - ch_offset; for (fr_size = pstr_ia_drc_params->drc_frame_size - 1; fr_size >= 0; fr_size--) @@ -186,16 +201,23 @@ static VOID impd_drc_apply_gains_and_add(ia_drc_gain_dec_struct *pstr_drc_gain_d if (0 >= pstr_drc_instruction->drc_set_id) { - for (num_ch = pstr_ia_drc_params->num_ch_process - 1; num_ch >= 0; num_ch--) + ch_offset = 0; + for (num_ch = 0; num_ch < pstr_ia_drc_params->num_ch_process; num_ch++) + { + if (ptr_inactive_sig[num_ch]) { + ch_offset++; + continue; + } for (fr_size = pstr_ia_drc_params->drc_frame_size - 1; fr_size >= 0; fr_size--) { - channel_audio[num_ch][fr_size] = deinterleaved_audio[num_ch][fr_size]; + channel_audio[num_ch - ch_offset][fr_size] = deinterleaved_audio[num_ch - ch_offset][fr_size]; } } } else { + ch_offset = 0; for (num_ch = pstr_ia_drc_params->channel_offset; num_ch < pstr_ia_drc_params->channel_offset + pstr_ia_drc_params->num_ch_process; num_ch++) @@ -204,6 +226,10 @@ static VOID impd_drc_apply_gains_and_add(ia_drc_gain_dec_struct *pstr_drc_gain_d if (num_ch_grp < 0) { sig_idx++; + if (ptr_inactive_sig[num_ch]) + { + ch_offset++; + } } else { @@ -213,9 +239,9 @@ static VOID impd_drc_apply_gains_and_add(ia_drc_gain_dec_struct *pstr_drc_gain_d for (num_band = pstr_drc_instruction->band_count_of_ch_group[num_ch_grp] - 1; num_band >= 0; num_band--) { - sum = ia_add_flt(sum, (deinterleaved_audio[sig_idx + num_band][fr_size])); + sum = ia_add_flt(sum, (deinterleaved_audio[sig_idx + num_band - ch_offset][fr_size])); } - channel_audio[num_ch - pstr_ia_drc_params->channel_offset][fr_size] = sum; + channel_audio[num_ch - pstr_ia_drc_params->channel_offset - ch_offset][fr_size] = sum; } sig_idx += pstr_drc_instruction->band_count_of_ch_group[num_ch_grp]; } @@ -235,6 +261,7 @@ static VOID impd_drc_apply_gains_and_add(ia_drc_gain_dec_struct *pstr_drc_gain_d * \param [in] pstr_drc_instruction_arr Pointer to instructions structure * \param [in] pstr_drc_gain_dec Pointer to drc gain structure * \param [in] sel_drc_idx drc index + * \param [in] ptr_inactive_sig Pointer to active signal information * * \return IA_ERRORCODE error * @@ -242,7 +269,8 @@ static VOID impd_drc_apply_gains_and_add(ia_drc_gain_dec_struct *pstr_drc_gain_d IA_ERRORCODE impd_drc_apply_gains_subband(FLOAT32 *deinterleaved_audio_re[], FLOAT32 *deinterleaved_audio_im[], ia_drc_instructions_struct *pstr_drc_instruction_arr, - ia_drc_gain_dec_struct *pstr_drc_gain_dec, WORD32 sel_drc_idx) + ia_drc_gain_dec_struct *pstr_drc_gain_dec, WORD32 sel_drc_idx, + UWORD32 *ptr_inactive_sig) { ia_drc_instructions_struct *pstr_drc_instruction; ia_drc_params_struct *pstr_ia_drc_params = &pstr_drc_gain_dec->ia_drc_params_struct; @@ -261,6 +289,7 @@ impd_drc_apply_gains_subband(FLOAT32 *deinterleaved_audio_re[], FLOAT32 *deinter FLOAT32 *lpcm_gain; FLOAT32 gain_sb, gain_lr; + WORD32 ch_offset = 0; switch (pstr_ia_drc_params->sub_band_domain_mode) { @@ -318,6 +347,12 @@ impd_drc_apply_gains_subband(FLOAT32 *deinterleaved_audio_re[], FLOAT32 *deinter num_ch++) { num_ch_grp = pstr_drc_instruction->channel_group_of_ch[num_ch]; + if (ptr_inactive_sig[num_ch] == 1) + { + ch_offset++; + sig_idx++; + continue; + } if (0 <= num_ch_grp) { for (size = drc_frame_size_sb - 1; size >= 0; size--) @@ -333,8 +368,8 @@ impd_drc_apply_gains_subband(FLOAT32 *deinterleaved_audio_re[], FLOAT32 *deinter for (cnt = 0; cnt < num_dec_sb; cnt++) { - deinterleaved_audio_re[sig_idx][size * num_dec_sb + cnt] *= (FLOAT32)gain_sb; - deinterleaved_audio_im[sig_idx][size * num_dec_sb + cnt] *= (FLOAT32)gain_sb; + deinterleaved_audio_re[sig_idx - ch_offset][size * num_dec_sb + cnt] *= (FLOAT32)gain_sb; + deinterleaved_audio_im[sig_idx - ch_offset][size * num_dec_sb + cnt] *= (FLOAT32)gain_sb; } } else @@ -359,17 +394,17 @@ impd_drc_apply_gains_subband(FLOAT32 *deinterleaved_audio_re[], FLOAT32 *deinter .overlap_weight[cnt], gain_lr)); } - deinterleaved_audio_re[sig_idx][size * num_dec_sb + cnt] *= gain_sb; + deinterleaved_audio_re[sig_idx - ch_offset][size * num_dec_sb + cnt] *= gain_sb; if (SUBBAND_DOMAIN_MODE_STFT256 != pstr_ia_drc_params->sub_band_domain_mode) { - deinterleaved_audio_im[sig_idx][size * num_dec_sb + cnt] *= gain_sb; + deinterleaved_audio_im[sig_idx - ch_offset][size * num_dec_sb + cnt] *= gain_sb; } else { if (0 != cnt) - deinterleaved_audio_im[sig_idx][size * num_dec_sb + cnt] *= gain_sb; + deinterleaved_audio_im[sig_idx - ch_offset][size * num_dec_sb + cnt] *= gain_sb; if (cnt == (num_dec_sb - 1)) - deinterleaved_audio_im[sig_idx][size * num_dec_sb + 0] *= gain_sb; + deinterleaved_audio_im[sig_idx - ch_offset][size * num_dec_sb + 0] *= gain_sb; } } } @@ -521,6 +556,7 @@ IA_ERRORCODE impd_drc_filter_banks_process(FLOAT32 *audio_io_buf[], * \param [in] boost_fac boost_fac factor * \param [in] compress_fac compression factor * \param [in] drc_characteristic_target characteristic target + * \param [in] ptr_inactive_sig Pointer to active signal information. * * \return IA_ERRORCODE error * @@ -531,7 +567,8 @@ IA_ERRORCODE impd_drc_td_process(FLOAT32 *audio_in_out_buf[], ia_drc_config *pstr_drc_config, ia_drc_gain_struct *pstr_drc_gain, FLOAT32 ln_gain_db, FLOAT32 boost_fac, FLOAT32 compress_fac, - WORD32 drc_characteristic_target) + WORD32 drc_characteristic_target, + UWORD32 *ptr_inactive_sig) { ia_drc_instructions_struct *pstr_drc_instruction = pstr_drc_config->str_drc_instruction_str; IA_ERRORCODE err_code = IA_MPEGH_DEC_NO_ERROR; @@ -551,7 +588,6 @@ IA_ERRORCODE impd_drc_td_process(FLOAT32 *audio_in_out_buf[], } } - { for (sel_drc_idx = pstr_drc_gain_dec->ia_drc_params_struct.drc_set_counter - 1; sel_drc_idx >= 0; sel_drc_idx--) { @@ -582,8 +618,7 @@ IA_ERRORCODE impd_drc_td_process(FLOAT32 *audio_in_out_buf[], } impd_drc_apply_gains_and_add(pstr_drc_gain_dec, audio_in_out_buf, pstr_drc_instruction, 1, - sel_drc_idx); - } + sel_drc_idx, ptr_inactive_sig); } } return err_code; @@ -612,7 +647,8 @@ IA_ERRORCODE impd_drc_fd_process(FLOAT32 *audio_real_buff[], FLOAT32 *audio_imag ia_drc_config *pstr_drc_config, ia_drc_gain_struct *pstr_drc_gain, FLOAT32 ln_gain_db, FLOAT32 boost_fac, FLOAT32 compress_fac, - WORD32 drc_characteristic_target) + WORD32 drc_characteristic_target, + UWORD32 *ptr_inactive_sig) { ia_drc_instructions_struct *pstr_drc_instruction = pstr_drc_config->str_drc_instruction_str; IA_ERRORCODE err_code = IA_MPEGH_DEC_NO_ERROR; @@ -638,7 +674,7 @@ IA_ERRORCODE impd_drc_fd_process(FLOAT32 *audio_real_buff[], FLOAT32 *audio_imag { err_code = impd_drc_apply_gains_subband(audio_real_buff, audio_imag_buff, pstr_drc_instruction, - pstr_drc_gain_dec, sel_drc_idx); + pstr_drc_gain_dec, sel_drc_idx, ptr_inactive_sig); if (err_code != IA_MPEGH_DEC_NO_ERROR) { return (err_code); diff --git a/decoder/impd_drc_process_audio.h b/decoder/impd_drc_process_audio.h index 03be8dc..8b1fa99 100644 --- a/decoder/impd_drc_process_audio.h +++ b/decoder/impd_drc_process_audio.h @@ -66,18 +66,21 @@ WORD32 impd_drc_td_process(FLOAT32 *audio_in_out_buf[], ia_drc_gain_dec_struct *p_drc_gain_dec_structs, ia_drc_config *pstr_drc_config, ia_drc_gain_struct *pstr_drc_gain, FLOAT32 loud_norm_gain_db, FLOAT32 boost, FLOAT32 compress, - WORD32 drc_characteristic); + WORD32 drc_characteristic, + UWORD32 *ptr_inactive_sig); WORD32 impd_drc_fd_process(FLOAT32 *audio_real_buff[], FLOAT32 *audio_imag_buff[], ia_drc_gain_dec_struct *p_drc_gain_dec_structs, ia_drc_config *pstr_drc_config, ia_drc_gain_struct *pstr_drc_gain, FLOAT32 loud_norm_gain_db, FLOAT32 boost, FLOAT32 compress, - WORD32 drc_characteristic); + WORD32 drc_characteristic, + UWORD32 *ptr_inactive_sig); WORD32 impd_drc_apply_gains_subband(FLOAT32 *deinterleaved_audio_re[], FLOAT32 *deinterleaved_audio_im[], ia_drc_instructions_struct *pstr_drc_instruction_arr, - ia_drc_gain_dec_struct *pstr_drc_gain_dec, WORD32 sel_drc_idx); + ia_drc_gain_dec_struct *pstr_drc_gain_dec, WORD32 sel_drc_idx, + UWORD32 *ptr_inactive_sig); WORD32 impd_drc_filter_banks_process(FLOAT32 *audio_io_buf[], ia_drc_instructions_struct *pstr_drc_instruction_arr, diff --git a/decoder/impeghd_api.c b/decoder/impeghd_api.c index 6414ca8..b6a341e 100644 --- a/decoder/impeghd_api.c +++ b/decoder/impeghd_api.c @@ -1283,6 +1283,11 @@ ia_core_coder_dec_init(ia_mpegh_dec_api_struct *p_obj_mpegh_dec) } p_state_mpegh_dec->i_bytes_consumed = header_bytes_consumed; + { + (void)ia_core_coder_search_asi((VOID *)p_obj_mpegh_dec, (UWORD8 *)in_buffer + header_bytes_consumed, + p_state_mpegh_dec->ui_in_bytes - header_bytes_consumed); + (void)ia_core_code_mdp((VOID *)p_obj_mpegh_dec, p_obj_mpegh_dec->mpeghd_config.i_preset_id); + } if (return_val == 0) { diff --git a/decoder/impeghd_ext_rend_intrfc.c b/decoder/impeghd_ext_rend_intrfc.c index 1494fc1..4f1a46a 100644 --- a/decoder/impeghd_ext_rend_intrfc.c +++ b/decoder/impeghd_ext_rend_intrfc.c @@ -547,12 +547,12 @@ IA_ERRORCODE impeghd_write_oam_meta_data_for_ext_ren( ia_obj_ren_dec_state_struct *pstr_obj_ren_dec_state, ia_signals_3d *pstr_3d_signals, ia_enh_obj_md_frame_str *pstr_enh_oam_frm, ia_mae_audio_scene_info *pstr_mae_asi) { - ia_oam_dec_config_struct *pstr_oam_cfg = &pstr_usac_config->obj_md_cfg; + ia_oam_dec_config_struct *pstr_oam_cfg = &pstr_usac_config->obj_md_cfg[0]; ia_oam_dec_state_struct *pstr_oam_dec_state = &pstr_obj_ren_dec_state->str_obj_md_dec_state; ia_enh_oam_config_struct *pstr_enh_oam_cfg = &pstr_usac_config->enh_obj_md_cfg; WORD32 audio_truncation_goa = 0, goa_num_samples = 0; WORD32 num_frames_goa = (pstr_oam_cfg->cc_frame_length / pstr_oam_cfg->frame_length); - WORD32 num_objects = pstr_oam_dec_state->num_objects; + WORD32 num_objects = pstr_oam_cfg->num_objects; WORD32 num_ext_elements, grp, mae_ele_id_offset = 0; /* FRAME CONFIGURATION */ impeghd_write_bits_buf(pstr_bit_buf, (pstr_oam_cfg->frame_length >> 6), 6); @@ -575,8 +575,8 @@ IA_ERRORCODE impeghd_write_oam_meta_data_for_ext_ren( } /* OBJECT METADATA */ - impeghd_write_bits_buf(pstr_bit_buf, pstr_oam_dec_state->num_objects, 9); - for (WORD32 obj = 0; obj < pstr_oam_dec_state->num_objects; obj++) + impeghd_write_bits_buf(pstr_bit_buf, pstr_oam_cfg->num_objects, 9); + for (WORD32 obj = 0; obj < pstr_oam_cfg->num_objects; obj++) { impeghd_write_bits_buf(pstr_bit_buf, impeghd_get_goa_ele_id(pstr_mae_asi, grp, obj, mae_ele_id_offset), 9); /*goa_element_id[obj]*/ impeghd_write_bits_buf(pstr_bit_buf, pstr_oam_cfg->dyn_obj_priority_present, 1); @@ -662,7 +662,7 @@ IA_ERRORCODE impeghd_write_oam_meta_data_for_ext_ren( case ID_EXT_ELE_PROD_METADATA: impeghd_write_goa_prod_meta_data_for_ext_ren(pstr_bit_buf, &pstr_usac_config->str_prod_metat_data, - pstr_oam_dec_state->num_objects); + pstr_oam_cfg->num_objects); } } } diff --git a/decoder/impeghd_ext_rend_intrfc_util.c b/decoder/impeghd_ext_rend_intrfc_util.c index f178a16..9372d92 100644 --- a/decoder/impeghd_ext_rend_intrfc_util.c +++ b/decoder/impeghd_ext_rend_intrfc_util.c @@ -565,11 +565,11 @@ IA_ERRORCODE impeghd_read_oam_meta_data_for_ext_ren( { WORD32 goa_audio_truncation = 0, goa_num_samples = 0, goa_num_frames, num_objects; WORD32 num_ext_elements; - ia_oam_dec_config_struct *pstr_oam_cfg = &pstr_usac_cfg->obj_md_cfg; + ia_oam_dec_config_struct *pstr_oam_cfg = &pstr_usac_cfg->obj_md_cfg[0]; ia_oam_dec_state_struct *pstr_oam_dec_state = &pstr_obj_ren_dec_state->str_obj_md_dec_state; ia_enh_oam_config_struct *pstr_enh_oam_cfg = &pstr_usac_cfg->enh_obj_md_cfg; goa_num_frames = (pstr_oam_cfg->cc_frame_length / pstr_oam_cfg->frame_length); - num_objects = pstr_oam_dec_state->num_objects; + num_objects = pstr_oam_cfg->num_objects; /* FRAME CONFIGURATION */ impeghd_read_bits_buf_util(pstr_bit_buf, (pstr_oam_cfg->frame_length >> 6), 6); @@ -580,8 +580,8 @@ IA_ERRORCODE impeghd_read_oam_meta_data_for_ext_ren( } /* OBJECT METADATA */ - impeghd_read_bits_buf_util(pstr_bit_buf, pstr_oam_dec_state->num_objects, 9); - for (WORD32 obj = 0; obj < pstr_oam_dec_state->num_objects; obj++) + impeghd_read_bits_buf_util(pstr_bit_buf, pstr_oam_cfg->num_objects, 9); + for (WORD32 obj = 0; obj < pstr_oam_cfg->num_objects; obj++) { impeghd_read_bits_buf_util(pstr_bit_buf, 0, 9); /*goa_element_id[obj]*/ impeghd_read_bits_buf_util(pstr_bit_buf, pstr_oam_cfg->dyn_obj_priority_present, 1); @@ -683,7 +683,7 @@ IA_ERRORCODE impeghd_read_oam_meta_data_for_ext_ren( { case ID_EXT_ELE_PROD_METADATA: impeghd_read_goa_prod_meta_data_for_ext_ren( - pstr_bit_buf, &pstr_usac_cfg->str_prod_metat_data, pstr_oam_dec_state->num_objects); + pstr_bit_buf, &pstr_usac_cfg->str_prod_metat_data, pstr_oam_cfg->num_objects); } } } diff --git a/decoder/impeghd_metadata_preprocessor.c b/decoder/impeghd_metadata_preprocessor.c index 040aa1e..f571803 100644 --- a/decoder/impeghd_metadata_preprocessor.c +++ b/decoder/impeghd_metadata_preprocessor.c @@ -3560,6 +3560,7 @@ static IA_ERRORCODE impeghd_screen_rel_zooming(FLOAT32 *azimuth, FLOAT32 *elevat * \param [in] pstr_signals_3d Pointer to sd signal configuration structure * \param [in,out] ptr_scratch_mem Pointer to scratch memory * \param [in] sel_preset Selection preset + * \param [in] oam_grp_idx Index of OAM group that is to be processed. * * \return IA_ERRORCODE Processing error if any. * @@ -3567,7 +3568,7 @@ static IA_ERRORCODE impeghd_screen_rel_zooming(FLOAT32 *azimuth, FLOAT32 *elevat static IA_ERRORCODE impeghd_md_proc_apply_scrn_rel_remapping_zooming( ia_interaction_data_struct *pstr_interaction_config, ia_audio_specific_config_struct *pstr_asc, ia_dec_data_struct *pstr_dec_data, - ia_signals_3d *pstr_signals_3d, pWORD8 ptr_scratch_mem, WORD32 sel_preset) + ia_signals_3d *pstr_signals_3d, pWORD8 ptr_scratch_mem, WORD32 sel_preset, WORD32 oam_grp_idx) { IA_ERRORCODE error = 0; WORD32 i, k, j; @@ -3641,7 +3642,7 @@ static IA_ERRORCODE impeghd_md_proc_apply_scrn_rel_remapping_zooming( for (i = 0; i < pstr_interaction_config->oam_count; i++) { pstr_interaction_config->scrn_rel_objs[i] = -1; - if (pstr_asc->str_usac_config.obj_md_cfg.is_screen_rel_obj[i] == 1) + if (pstr_asc->str_usac_config.obj_md_cfg[oam_grp_idx].is_screen_rel_obj[i] == 1) { pstr_interaction_config->scrn_rel_objs[pstr_interaction_config->list_oam[i]] = 1; } @@ -3909,7 +3910,8 @@ static IA_ERRORCODE impeghd_md_proc_apply_div_proc(ia_interaction_data_struct *p ia_enh_oam_config_struct *pstr_enh_obj_md_cfg, ia_enh_obj_md_frame_str *pstr_enh_obj_md_frame, ia_signals_3d *pstr_signals_3d, - ia_dec_data_struct *pstr_dec_data) + ia_dec_data_struct *pstr_dec_data, + WORD32 obj_grp_idx) { WORD32 i, k, m; WORD32 n; @@ -3917,7 +3919,7 @@ static IA_ERRORCODE impeghd_md_proc_apply_div_proc(ia_interaction_data_struct *p ia_mae_audio_scene_info *pstr_mae_asi = &pstr_asc->str_mae_asi; ia_oam_dec_state_struct *pstr_oam_dec_state = &pstr_dec_data->str_obj_ren_dec_state.str_obj_md_dec_state; - ia_oam_dec_config_struct *pstr_oam_dec_cfg = &pstr_asc->str_usac_config.obj_md_cfg; + ia_oam_dec_config_struct *pstr_oam_dec_cfg = &pstr_asc->str_usac_config.obj_md_cfg[obj_grp_idx]; if (pstr_interact_cfg->num_objs_out > pstr_interact_cfg->num_objs_in) { @@ -4155,11 +4157,12 @@ static IA_ERRORCODE impeghd_md_proc_apply_div_proc(ia_interaction_data_struct *p * */ static WORD32 impeghd_md_proc_local_scrn_cfg(ia_audio_specific_config_struct *pstr_asc, - ia_local_setup_struct *pstr_local_interaction) + ia_local_setup_struct *pstr_local_interaction, + WORD32 obj_grp_idx) { WORD32 i; WORD32 has_screen_relative_objects = 0; - ia_oam_dec_config_struct *pstr_oam_dec_config = &pstr_asc->str_usac_config.obj_md_cfg; + ia_oam_dec_config_struct *pstr_oam_dec_config = &pstr_asc->str_usac_config.obj_md_cfg[obj_grp_idx]; for (i = 0; i < MAX_NUM_OAM_OBJS; i++) { if (pstr_oam_dec_config->is_screen_rel_obj[i] == 1) @@ -4395,8 +4398,7 @@ static IA_ERRORCODE impeghd_mp_process_frame(ia_audio_specific_config_struct *ps WORD32 overall_num_div_objs_added = 0; pWORD8 ptr_scratch = ptr_scratch_mem; WORD32 add_objects; - ia_oam_dec_state_struct *pstr_oam_dec_state = - &pstr_dec_data->str_obj_ren_dec_state.str_obj_md_dec_state; + WORD32 obj_grp_idx = 0; ia_enh_oam_config_struct *pstr_enh_oam_cfg = &pstr_asc->str_usac_config.enh_obj_md_cfg; ia_enh_obj_md_frame_str *pstr_enh_oam_frame = &pstr_dec_data->str_enh_obj_md_frame; ia_mae_audio_scene_info *pstr_mae_asi = &pstr_asc->str_mae_asi; @@ -4405,6 +4407,8 @@ static IA_ERRORCODE impeghd_mp_process_frame(ia_audio_specific_config_struct *ps pstr_interact_cfg->ptr_ele_interaction_data = pstr_ei_data; ia_signals_3d *pstr_signals_3d = &pstr_asc->str_usac_config.signals_3d; ia_scene_disp_data *pstr_scene_displacement = &pstr_dec_data->str_scene_displacement; + ia_oam_dec_config_struct *pstr_oam_cfg = + &pstr_asc->str_usac_config.obj_md_cfg[obj_grp_idx]; add_objects = (pstr_enh_oam_cfg->num_obj_with_divergence << 1); (void)num_out_channels; @@ -4487,9 +4491,9 @@ static IA_ERRORCODE impeghd_mp_process_frame(ia_audio_specific_config_struct *ps pstr_interact_cfg->num_decoded_groups = pstr_mae_asi->num_groups; pstr_interact_cfg->num_switch_groups = pstr_mae_asi->num_switch_groups; pstr_interact_cfg->num_ele_in = 0; - if (pstr_oam_dec_state->num_objects > 0) + if (pstr_oam_cfg->num_objects > 0) { - pstr_interact_cfg->num_objs_out = pstr_oam_dec_state->num_objects + add_objects; + pstr_interact_cfg->num_objs_out = pstr_oam_cfg->num_objects + add_objects; } for (i = 0; i < pstr_interact_cfg->num_decoded_groups; i++) @@ -4511,7 +4515,7 @@ static IA_ERRORCODE impeghd_mp_process_frame(ia_audio_specific_config_struct *ps } pstr_interact_cfg->en_scrn_rel_processing = - impeghd_md_proc_local_scrn_cfg(pstr_asc, &pstr_dec_data->str_local_setup_interaction); + impeghd_md_proc_local_scrn_cfg(pstr_asc, &pstr_dec_data->str_local_setup_interaction, obj_grp_idx); if (pstr_interact_cfg->apply_intrct_data != 0) { @@ -4681,7 +4685,8 @@ static IA_ERRORCODE impeghd_mp_process_frame(ia_audio_specific_config_struct *ps { error = impeghd_md_proc_apply_div_proc(pstr_interact_cfg, pstr_asc, &overall_num_div_objs_added, pstr_enh_oam_cfg, - pstr_enh_oam_frame, pstr_signals_3d, pstr_dec_data); + pstr_enh_oam_frame, pstr_signals_3d, pstr_dec_data, + obj_grp_idx); if (error) { return error; @@ -4692,7 +4697,7 @@ static IA_ERRORCODE impeghd_mp_process_frame(ia_audio_specific_config_struct *ps { error = impeghd_apply_scene_displacement( pstr_dec_data, pstr_asc, pstr_interact_cfg, ptr_scratch, - (pstr_oam_dec_state->num_objects > 0 ? 1 : 0), pstr_scene_displacement); + (pstr_oam_cfg->num_objects > 0 ? 1 : 0), pstr_scene_displacement); if (error) { return error; @@ -4701,8 +4706,11 @@ static IA_ERRORCODE impeghd_mp_process_frame(ia_audio_specific_config_struct *ps if (pstr_enh_oam_frame->oam_has_been_decoded == 1) { + // TODO: Support to be extended for all active OAM groups + WORD32 oam_grp_idx = 0; error = impeghd_md_proc_apply_scrn_rel_remapping_zooming( - pstr_interact_cfg, pstr_asc, pstr_dec_data, pstr_signals_3d, ptr_scratch, sel_preset); + pstr_interact_cfg, pstr_asc, pstr_dec_data, pstr_signals_3d, ptr_scratch, sel_preset, + oam_grp_idx); if (error) { return error; diff --git a/decoder/impeghd_oam_dec.c b/decoder/impeghd_oam_dec.c index ddb2a34..502eebe 100644 --- a/decoder/impeghd_oam_dec.c +++ b/decoder/impeghd_oam_dec.c @@ -70,12 +70,13 @@ * */ IA_ERRORCODE impeghd_obj_md_dec(ia_oam_dec_state_struct *ptr_oam_dec_state, + ia_oam_dec_config_struct *p_obj_md_cfg, ia_bit_buf_struct *ptr_bit_buf) { IA_ERRORCODE err_code = IA_MPEGH_DEC_NO_ERROR; - if (ptr_oam_dec_state->p_obj_md_cfg->ld_md_coding_present != 0) + if (p_obj_md_cfg->ld_md_coding_present != 0) { - err_code = impeghd_obj_md_low_delay_dec(ptr_oam_dec_state, ptr_bit_buf); + err_code = impeghd_obj_md_low_delay_dec(ptr_oam_dec_state, p_obj_md_cfg, ptr_bit_buf); } else { diff --git a/decoder/impeghd_oam_dec.h b/decoder/impeghd_oam_dec.h index 3b5490f..620d366 100644 --- a/decoder/impeghd_oam_dec.h +++ b/decoder/impeghd_oam_dec.h @@ -36,6 +36,7 @@ #define IMPEGHD_OAM_DEC_H IA_ERRORCODE impeghd_obj_md_low_delay_dec(ia_oam_dec_state_struct *ptr_oam_dec_state, + ia_oam_dec_config_struct *p_obj_md_cfg, ia_bit_buf_struct *ptr_bit_buf); IA_ERRORCODE impeghd_obj_md_cfg(ia_oam_dec_config_struct *p_obj_md_cfg, @@ -43,9 +44,11 @@ IA_ERRORCODE impeghd_obj_md_cfg(ia_oam_dec_config_struct *p_obj_md_cfg, WORD32 num_objects); IA_ERRORCODE impeghd_obj_md_dec(ia_oam_dec_state_struct *ptr_oam_dec_state, + ia_oam_dec_config_struct *p_obj_md_cfg, ia_bit_buf_struct *ptr_bit_buf); -VOID impeghd_descale_ld_obj_md(ia_oam_dec_state_struct *ptr_oam_dec_state); +VOID impeghd_descale_ld_obj_md(ia_oam_dec_state_struct *ptr_oam_dec_state, + ia_oam_dec_config_struct *p_obj_md_cfg); IA_ERRORCODE impeghd_enh_obj_md_config(ia_enh_oam_config_struct *p_enh_obj_md_cfg, ia_bit_buf_struct *ptr_bit_buf, WORD32 num_objects); diff --git a/decoder/impeghd_oam_dec_ld.c b/decoder/impeghd_oam_dec_ld.c index 29e074b..02d4631 100644 --- a/decoder/impeghd_oam_dec_ld.c +++ b/decoder/impeghd_oam_dec_ld.c @@ -68,11 +68,12 @@ * * */ -static VOID impeghd_limit_range_ld_obj_md(ia_oam_dec_state_struct *ptr_oam_dec_state) +static VOID impeghd_limit_range_ld_obj_md(ia_oam_dec_state_struct *ptr_oam_dec_state, + WORD32 num_elements, + WORD32 uniform_spread) { - WORD32 n, num_elements; + WORD32 n; FLOAT32 minval, maxval; - num_elements = ptr_oam_dec_state->num_objects; /* radius */ maxval = 16.f; minval = 0.5f; @@ -113,7 +114,7 @@ static VOID impeghd_limit_range_ld_obj_md(ia_oam_dec_state_struct *ptr_oam_dec_s ptr_oam_dec_state->spread_width_descaled[n] = ia_min_int(ia_max_int(ptr_oam_dec_state->spread_width_descaled[n], minval), maxval); } - if (!ptr_oam_dec_state->p_obj_md_cfg->uniform_spread_present) + if (!uniform_spread) { /* spread depth */ maxval = 15.5f; @@ -152,13 +153,15 @@ static VOID impeghd_limit_range_ld_obj_md(ia_oam_dec_state_struct *ptr_oam_dec_s * \return IA_ERRORCODE Error code if any. * */ -static IA_ERRORCODE impeghd_obj_md_descale_limit(ia_oam_dec_state_struct *ptr_oam_dec_state) +static IA_ERRORCODE impeghd_obj_md_descale_limit(ia_oam_dec_state_struct *ptr_oam_dec_state, + ia_oam_dec_config_struct *p_obj_md_cfg) { IA_ERRORCODE err_code = IA_MPEGH_DEC_NO_ERROR; - impeghd_descale_ld_obj_md(ptr_oam_dec_state); + impeghd_descale_ld_obj_md(ptr_oam_dec_state, p_obj_md_cfg); - impeghd_limit_range_ld_obj_md(ptr_oam_dec_state); + impeghd_limit_range_ld_obj_md(ptr_oam_dec_state, p_obj_md_cfg->num_objects, + p_obj_md_cfg->uniform_spread_present); return err_code; } @@ -300,6 +303,7 @@ static VOID impeghd_ic_oam_ld_unsigned_param_dec(WORD32 fix_val_flag, WORD32 par * */ static IA_ERRORCODE impeghd_single_dyn_obj_md(ia_oam_dec_state_struct *ptr_oam_dec_state, + ia_oam_dec_config_struct *p_obj_md_cfg, ia_bit_buf_struct *ptr_bit_buf, WORD32 flag_absolute, WORD32 obj_idx) { @@ -347,7 +351,7 @@ static IA_ERRORCODE impeghd_single_dyn_obj_md(ia_oam_dec_state_struct *ptr_oam_d } if (!ptr_oam_dec_state->spread_fixed) { - if (!ptr_oam_dec_state->p_obj_md_cfg->uniform_spread_present) + if (!p_obj_md_cfg->uniform_spread_present) { WORD32 num_bits = ia_min_int(OAM_SPREAD_WIDTH_BITS + 1, nbits); if (ia_core_coder_read_bits_buf(ptr_bit_buf, OAM_FLAG_BITS)) @@ -385,7 +389,7 @@ static IA_ERRORCODE impeghd_single_dyn_obj_md(ia_oam_dec_state_struct *ptr_oam_d ptr_oam_dec_state->spread_height[obj_idx] = 0; ptr_oam_dec_state->spread_depth[obj_idx] = 0; } - if (ptr_oam_dec_state->p_obj_md_cfg->dyn_obj_priority_present) + if (p_obj_md_cfg->dyn_obj_priority_present) { if (ia_core_coder_read_bits_buf(ptr_bit_buf, OAM_FLAG_BITS)) { @@ -440,7 +444,7 @@ static IA_ERRORCODE impeghd_single_dyn_obj_md(ia_oam_dec_state_struct *ptr_oam_d } else { - if (!ptr_oam_dec_state->p_obj_md_cfg->uniform_spread_present) + if (!p_obj_md_cfg->uniform_spread_present) { ptr_oam_dec_state->spread_width[obj_idx] = ia_core_coder_read_bits_buf(ptr_bit_buf, OAM_SPREAD_WIDTH_BITS); @@ -455,7 +459,7 @@ static IA_ERRORCODE impeghd_single_dyn_obj_md(ia_oam_dec_state_struct *ptr_oam_d ia_core_coder_read_bits_buf(ptr_bit_buf, OAM_SPREAD_WIDTH_BITS); } } - if (ptr_oam_dec_state->p_obj_md_cfg->dyn_obj_priority_present) + if (p_obj_md_cfg->dyn_obj_priority_present) { if (!ptr_oam_dec_state->dynamic_obj_priority_fixed) { @@ -484,12 +488,15 @@ static IA_ERRORCODE impeghd_single_dyn_obj_md(ia_oam_dec_state_struct *ptr_oam_d * */ static IA_ERRORCODE impeghd_ic_obj_md_ld_dec(ia_oam_dec_state_struct *ptr_oam_dec_state, + ia_oam_dec_config_struct *p_obj_md_cfg, ia_bit_buf_struct *ptr_bit_buf) { IA_ERRORCODE err_code = IA_MPEGH_DEC_NO_ERROR; - WORD32 num_objects = ptr_oam_dec_state->num_objects; + WORD32 num_objects = p_obj_md_cfg->num_objects; WORD32 obj_idx_start = (ptr_oam_dec_state->sub_frame_number - 1) * num_objects; WORD32 obj_idx_end = (ptr_oam_dec_state->sub_frame_number) * num_objects; + obj_idx_start += ptr_oam_dec_state->obj_sub_frm_off; + obj_idx_end += ptr_oam_dec_state->obj_sub_frm_off; if (!(num_objects > 1)) { /* Azimuth */ @@ -510,7 +517,7 @@ static IA_ERRORCODE impeghd_ic_obj_md_ld_dec(ia_oam_dec_state_struct *ptr_oam_de impeghd_oam_read_sign_param(ptr_bit_buf, OAM_GAIN_BITS); /* Spread */ - if (!ptr_oam_dec_state->p_obj_md_cfg->uniform_spread_present) + if (!p_obj_md_cfg->uniform_spread_present) { ptr_oam_dec_state->spread_width[obj_idx_start] = ia_core_coder_read_bits_buf(ptr_bit_buf, OAM_SPREAD_WIDTH_BITS); @@ -525,7 +532,7 @@ static IA_ERRORCODE impeghd_ic_obj_md_ld_dec(ia_oam_dec_state_struct *ptr_oam_de ia_core_coder_read_bits_buf(ptr_bit_buf, OAM_SPREAD_WIDTH_BITS); } /* Dynamic Object Priority */ - if (ptr_oam_dec_state->p_obj_md_cfg->dyn_obj_priority_present) + if (p_obj_md_cfg->dyn_obj_priority_present) { ptr_oam_dec_state->dyn_obj_priority[obj_idx_start] = ia_core_coder_read_bits_buf(ptr_bit_buf, OAM_DYN_OBJ_PRI_BITS); @@ -579,7 +586,7 @@ static IA_ERRORCODE impeghd_ic_obj_md_ld_dec(ia_oam_dec_state_struct *ptr_oam_de com_val_flag = ia_core_coder_read_bits_buf(ptr_bit_buf, OAM_FLAG_BITS); if (com_val_flag) { - if (ptr_oam_dec_state->p_obj_md_cfg->uniform_spread_present) + if (p_obj_md_cfg->uniform_spread_present) { param_val = ia_core_coder_read_bits_buf(ptr_bit_buf, OAM_SPREAD_WIDTH_BITS); for (i = obj_idx_start; i < obj_idx_end; i++) @@ -602,7 +609,7 @@ static IA_ERRORCODE impeghd_ic_obj_md_ld_dec(ia_oam_dec_state_struct *ptr_oam_de } else { - if (ptr_oam_dec_state->p_obj_md_cfg->uniform_spread_present) + if (p_obj_md_cfg->uniform_spread_present) { for (i = obj_idx_start; i < obj_idx_end; i++) { @@ -627,7 +634,7 @@ static IA_ERRORCODE impeghd_ic_obj_md_ld_dec(ia_oam_dec_state_struct *ptr_oam_de } else { - if (ptr_oam_dec_state->p_obj_md_cfg->uniform_spread_present) + if (p_obj_md_cfg->uniform_spread_present) { param_val = ia_core_coder_read_bits_buf(ptr_bit_buf, OAM_SPREAD_WIDTH_BITS); for (i = 0; i < num_objects; i++) @@ -649,7 +656,7 @@ static IA_ERRORCODE impeghd_ic_obj_md_ld_dec(ia_oam_dec_state_struct *ptr_oam_de } } /* Dynamic Object Priority */ - if (ptr_oam_dec_state->p_obj_md_cfg->dyn_obj_priority_present) + if (p_obj_md_cfg->dyn_obj_priority_present) { ptr_oam_dec_state->dynamic_obj_priority_fixed = ia_core_coder_read_bits_buf(ptr_bit_buf, OAM_FLAG_BITS); @@ -671,18 +678,21 @@ static IA_ERRORCODE impeghd_ic_obj_md_ld_dec(ia_oam_dec_state_struct *ptr_oam_de * * */ -VOID impeghd_descale_ld_obj_md(ia_oam_dec_state_struct *ptr_oam_dec_state) +VOID impeghd_descale_ld_obj_md(ia_oam_dec_state_struct *ptr_oam_dec_state, + ia_oam_dec_config_struct *p_obj_md_cfg) { WORD32 o; - WORD32 num_objects = ptr_oam_dec_state->num_objects; + WORD32 num_objects = p_obj_md_cfg->num_objects; WORD32 obj_start_idx = (ptr_oam_dec_state->sub_frame_number - 1) * num_objects; WORD32 obj_end_idx = (ptr_oam_dec_state->sub_frame_number) * num_objects; + obj_start_idx += ptr_oam_dec_state->obj_sub_frm_off; + obj_end_idx += ptr_oam_dec_state->obj_sub_frm_off; for (o = obj_start_idx; o < obj_end_idx; o++) { ptr_oam_dec_state->dyn_obj_priority_descaled[o] = (FLOAT32)ptr_oam_dec_state->dyn_obj_priority[o]; } - if (ptr_oam_dec_state->p_obj_md_cfg->uniform_spread_present != 1) + if (p_obj_md_cfg->uniform_spread_present != 1) { for (o = obj_start_idx; o < obj_end_idx; o++) { @@ -727,25 +737,28 @@ VOID impeghd_descale_ld_obj_md(ia_oam_dec_state_struct *ptr_oam_dec_state) * */ IA_ERRORCODE impeghd_obj_md_low_delay_dec(ia_oam_dec_state_struct *ptr_oam_dec_state, + ia_oam_dec_config_struct *p_obj_md_cfg, ia_bit_buf_struct *ptr_bit_buf) { WORD32 i; + WORD32 num_objects = p_obj_md_cfg->num_objects; IA_ERRORCODE err_code = IA_MPEGH_DEC_NO_ERROR; WORD32 intra_obj_md_present = ia_core_coder_read_bits_buf(ptr_bit_buf, OAM_FLAG_BITS); if (!intra_obj_md_present) { WORD32 flag_absolute = ia_core_coder_read_bits_buf(ptr_bit_buf, OAM_FLAG_BITS); - WORD32 num_objects = ptr_oam_dec_state->num_objects; WORD32 obj_start_idx = (ptr_oam_dec_state->sub_frame_number - 1) * num_objects; WORD32 obj_end_idx = (ptr_oam_dec_state->sub_frame_number) * num_objects; + obj_start_idx += ptr_oam_dec_state->obj_sub_frm_off; + obj_end_idx += ptr_oam_dec_state->obj_sub_frm_off; for (i = obj_start_idx; i < obj_end_idx; i++) { WORD32 obj_md_present = ia_core_coder_read_bits_buf(ptr_bit_buf, OAM_FLAG_BITS); ptr_oam_dec_state->has_obj_md[obj_start_idx] = obj_md_present; if (obj_md_present) { - err_code = impeghd_single_dyn_obj_md(ptr_oam_dec_state, ptr_bit_buf, flag_absolute, i); + err_code = impeghd_single_dyn_obj_md(ptr_oam_dec_state, p_obj_md_cfg, ptr_bit_buf, flag_absolute, i); if (err_code) { return err_code; @@ -755,16 +768,16 @@ IA_ERRORCODE impeghd_obj_md_low_delay_dec(ia_oam_dec_state_struct *ptr_oam_dec_s } else { - err_code = impeghd_ic_obj_md_ld_dec(ptr_oam_dec_state, ptr_bit_buf); + err_code = impeghd_ic_obj_md_ld_dec(ptr_oam_dec_state, p_obj_md_cfg, ptr_bit_buf); } if (err_code) { return err_code; } - err_code = impeghd_obj_md_descale_limit(ptr_oam_dec_state); - for (i = 0; i < ptr_oam_dec_state->num_objects; i++) - ptr_oam_dec_state->sample[i] += ptr_oam_dec_state->p_obj_md_cfg->frame_length; + err_code = impeghd_obj_md_descale_limit(ptr_oam_dec_state, p_obj_md_cfg); + for (i = 0; i < num_objects; i++) + ptr_oam_dec_state->sample[i] += p_obj_md_cfg->frame_length; return err_code; } diff --git a/decoder/impeghd_oam_dec_struct_def.h b/decoder/impeghd_oam_dec_struct_def.h index a5f082b..6e77162 100644 --- a/decoder/impeghd_oam_dec_struct_def.h +++ b/decoder/impeghd_oam_dec_struct_def.h @@ -68,10 +68,10 @@ typedef struct typedef struct { - ia_oam_dec_config_struct *p_obj_md_cfg; WORD32 has_obj_md[MAX_OAM_FRAMES * MAX_NUM_OAM_OBJS]; WORD32 sub_frame_obj_md_present[MAX_OAM_FRAMES]; - WORD32 num_objects; + WORD32 obj_sub_frm_off; + WORD32 obj_start; WORD32 sub_frame_number; WORD32 intra_frame_period; WORD32 sample[MAX_OAM_FRAMES * MAX_NUM_OAM_OBJS]; diff --git a/decoder/impeghd_obj_ren_dec.c b/decoder/impeghd_obj_ren_dec.c index 3e9d85d..ff4b986 100644 --- a/decoder/impeghd_obj_ren_dec.c +++ b/decoder/impeghd_obj_ren_dec.c @@ -1316,18 +1316,21 @@ IA_ERRORCODE impeghd_obj_renderer_dec_init(ia_obj_ren_dec_state_struct *ptr_obj_ */ IA_ERRORCODE -impeghd_obj_renderer_dec(ia_obj_ren_dec_state_struct *ptr_obj_ren_dec_state, FLOAT32 *p_in_buf, +impeghd_obj_renderer_dec(ia_obj_ren_dec_state_struct *ptr_obj_ren_dec_state, + ia_oam_dec_config_struct *p_oam_md_cfg, FLOAT32 *p_in_buf, FLOAT32 *p_out_buf, WORD32 cc_frame_len) { IA_ERRORCODE err_code = IA_MPEGH_DEC_NO_ERROR; WORD32 ch, obj; WORD32 frame_length, num_objects, num_channels, sub_frame_offset; - WORD32 lfe_counter, obj_idx; + WORD32 lfe_counter, obj_idx, obj_start; ia_oam_dec_state_struct *ptr_obj_md_dec_state = &ptr_obj_ren_dec_state->str_obj_md_dec_state; - num_objects = ptr_obj_md_dec_state->num_objects; - frame_length = ptr_obj_md_dec_state->p_obj_md_cfg->frame_length; + num_objects = p_oam_md_cfg->num_objects; + frame_length = p_oam_md_cfg->frame_length; num_channels = ptr_obj_ren_dec_state->num_cicp_speakers; sub_frame_offset = (ptr_obj_md_dec_state->sub_frame_number - 1) * num_objects; + sub_frame_offset += ptr_obj_md_dec_state->obj_sub_frm_off; + obj_start = ptr_obj_md_dec_state->obj_start; for (obj = 0; obj < num_objects; obj++) { @@ -1349,9 +1352,9 @@ impeghd_obj_renderer_dec(ia_obj_ren_dec_state_struct *ptr_obj_ren_dec_state, FLO WORD32 j = 0; WORD32 ch_idx = ch - lfe_counter; FLOAT32 step = ia_sub_flt(ptr_obj_ren_dec_state->final_gains[ch_idx], - ptr_obj_ren_dec_state->initial_gains[obj][ch_idx]) / + ptr_obj_ren_dec_state->initial_gains[obj + obj_start][ch_idx]) / frame_length; - FLOAT32 scale = ptr_obj_ren_dec_state->initial_gains[obj][ch_idx] + step; + FLOAT32 scale = ptr_obj_ren_dec_state->initial_gains[obj + obj_start][ch_idx] + step; for (j = 0; j < frame_length; j++) { p_out_buf[j] = ia_mac_flt(p_out_buf[j], p_in_buf[j], scale); @@ -1360,11 +1363,11 @@ impeghd_obj_renderer_dec(ia_obj_ren_dec_state_struct *ptr_obj_ren_dec_state, FLO } p_out_buf += cc_frame_len; } - memcpy(&ptr_obj_ren_dec_state->initial_gains[obj][0], &ptr_obj_ren_dec_state->final_gains[0], + memcpy(&ptr_obj_ren_dec_state->initial_gains[obj + obj_start][0], &ptr_obj_ren_dec_state->final_gains[0], sizeof(ptr_obj_ren_dec_state->final_gains[0]) * (num_channels - lfe_counter)); p_out_buf -= (cc_frame_len * num_channels); p_in_buf += cc_frame_len; - ptr_obj_ren_dec_state->first_frame_flag[obj] = 0; + ptr_obj_ren_dec_state->first_frame_flag[obj + obj_start] = 0; } return err_code; } diff --git a/decoder/impeghd_obj_ren_dec.h b/decoder/impeghd_obj_ren_dec.h index 897183f..addd0de 100644 --- a/decoder/impeghd_obj_ren_dec.h +++ b/decoder/impeghd_obj_ren_dec.h @@ -41,7 +41,8 @@ IA_ERRORCODE impeghd_obj_renderer_dec_init(ia_obj_ren_dec_state_struct *ptr_obj_ IA_ERRORCODE impegh_obj_ren_vbap_process(ia_obj_ren_dec_state_struct *ptr_obj_ren_dec_state, WORD32 obj_idx); IA_ERRORCODE -impeghd_obj_renderer_dec(ia_obj_ren_dec_state_struct *ptr_obj_ren_dec_state, FLOAT32 *p_in_buf, +impeghd_obj_renderer_dec(ia_obj_ren_dec_state_struct *ptr_obj_ren_dec_state, + ia_oam_dec_config_struct *p_oam_md_cfg, FLOAT32 *p_in_buf, FLOAT32 *p_out_buf, WORD32 cc_frame_len); #endif /* IMPEGHD_OBJ_REN_DEC_H */ \ No newline at end of file diff --git a/decoder/impeghd_ver_number.h b/decoder/impeghd_ver_number.h index d451416..222155c 100644 --- a/decoder/impeghd_ver_number.h +++ b/decoder/impeghd_ver_number.h @@ -36,11 +36,11 @@ #define IMPEGHD_VER_NUMBER_H #ifdef _ARM_ -#define MPEG_H_3D_AUD_DEC_ITTIAM_VER "_ARM $Rev: 1.6 $" +#define MPEG_H_3D_AUD_DEC_ITTIAM_VER "_ARM $Rev: 1.7 $" #elif _X86_ -#define MPEG_H_3D_AUD_DEC_ITTIAM_VER "_X86 $Rev: 1.6 $" +#define MPEG_H_3D_AUD_DEC_ITTIAM_VER "_X86 $Rev: 1.7 $" #else -#define MPEG_H_3D_AUD_DEC_ITTIAM_VER "_MSVC $Rev: 1.6 $" +#define MPEG_H_3D_AUD_DEC_ITTIAM_VER "_MSVC $Rev: 1.7 $" #endif #endif /* IMPEGHD_VER_NUMBER_H */ diff --git a/docs/IA-MPEG-H-3D-Audio-Dec-DS.doc b/docs/IA-MPEG-H-3D-Audio-Dec-DS.doc index e6c8231..61f60fe 100644 Binary files a/docs/IA-MPEG-H-3D-Audio-Dec-DS.doc and b/docs/IA-MPEG-H-3D-Audio-Dec-DS.doc differ diff --git a/test/mp4/impeghd_mp4_file_wrapper.h b/test/mp4/impeghd_mp4_file_wrapper.h index 5491a9c..8e59de2 100644 --- a/test/mp4/impeghd_mp4_file_wrapper.h +++ b/test/mp4/impeghd_mp4_file_wrapper.h @@ -61,7 +61,7 @@ pVOID impeghd_mp4_fopen(pUWORD8 file_name, UWORD8 with_file, WORD32 size); WORD32 impeghd_mp4_fclose(pVOID itf); WORD32 impeghd_mp4_parse_mae_boxes(ia_file_wrapper *g_pf_inp_str, pVOID ptr_dec_api); -#define MAX_USAC_CH (24) +#define MAX_USAC_CH (56) #define IN_BUF_SIZE (768 * MAX_USAC_CH + 128) #endif /* IMPEGHD_MP4_FILE_WRAPPER_H */