Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 27 additions & 13 deletions encoder/impeghe_api.c
Original file line number Diff line number Diff line change
Expand Up @@ -109,9 +109,13 @@ IA_ERRORCODE impeghe_process(ia_mpeghe_api_struct *p_obj_mpeghe, WORD32 *header_
*/
static VOID impeghe_check_config_params(ia_input_config *pstr_input_config)
{
WORD32 num_groups = pstr_input_config->num_obj_sig_groups +
pstr_input_config->num_hoa_sig_groups +
WORD32 num_groups = pstr_input_config->num_hoa_sig_groups +
pstr_input_config->num_ch_sig_groups;
for (WORD32 i = 0; i < pstr_input_config->num_obj_sig_groups; i++)
{
if (pstr_input_config->use_oam_element[i])
num_groups++;
}
for (WORD32 i = 0; i< num_groups; i++)
{
if (pstr_input_config->aud_ch_pcm_cfg[i].n_channels > 0)
Expand Down Expand Up @@ -389,12 +393,18 @@ static IA_ERRORCODE impeghe_set_config_params(ia_mpeghe_api_struct *p_obj_mpeghe
LOOPIDX idx;
LOOPIDX i, j;
ia_usac_audio_specific_config_struct *pstr_asc = &p_obj_mpeghe->config.audio_specific_config;
WORD32 num_groups = pstr_input_config->num_obj_sig_groups +
pstr_input_config->num_hoa_sig_groups +
WORD32 num_groups = pstr_input_config->num_hoa_sig_groups +
pstr_input_config->num_ch_sig_groups;

WORD32 num_core_chn = 0;
WORD32 num_st_objs = 0; // includes channels from channel based input and objects as well.

for (WORD32 i = 0; i < pstr_input_config->num_obj_sig_groups; i++)
{
if (pstr_input_config->use_oam_element[i])
num_groups++;
}

for (i = 0; i < pstr_input_config->num_ch_sig_groups; i++)
{
num_st_objs += pstr_input_config->num_ch_per_sig_grp[i];
Expand Down Expand Up @@ -453,11 +463,11 @@ static IA_ERRORCODE impeghe_set_config_params(ia_mpeghe_api_struct *p_obj_mpeghe
for (idx = 0; idx < pstr_input_config->num_obj_sig_groups; idx++)
{
if (OAM_MAX_NUM_OBJECTS < p_obj_mpeghe->config.num_objects[idx])
{
{
p_obj_mpeghe->config.extra_objects[idx] = p_obj_mpeghe->config.num_objects[idx] - OAM_MAX_NUM_OBJECTS;
p_obj_mpeghe->config.num_objects[idx] = OAM_MAX_NUM_OBJECTS;
error = IMPEGHE_CONFIG_NONFATAL_NUM_OBJECTS_UNSUPPORTED;
}
error = IMPEGHE_CONFIG_NONFATAL_NUM_OBJECTS_UNSUPPORTED;
}


if (OAM_MAX_NUM_OBJECTS < p_obj_mpeghe->config.num_objects[idx])
Expand Down Expand Up @@ -629,7 +639,7 @@ static IA_ERRORCODE impeghe_set_config_params(ia_mpeghe_api_struct *p_obj_mpeghe
// OAM Params
memcpy(p_obj_mpeghe->config.use_oam_element, pstr_input_config->use_oam_element, sizeof(pstr_input_config->use_oam_element));
p_obj_mpeghe->config.cicp_index = pstr_input_config->cicp_index;
if (pstr_input_config->use_oam_element[0])
if (p_obj_mpeghe->config.num_oam_ch)
{
// If OAM is in use, then ifile option is not valid
if (pstr_input_config->use_hoa_element)
Expand Down Expand Up @@ -1149,7 +1159,7 @@ static IA_ERRORCODE impeghe_set_config_params(ia_mpeghe_api_struct *p_obj_mpeghe
pstr_input_config->aud_ch_pcm_cfg[0].n_channels;
pstr_input_config->str_drc_cfg.str_enc_params.sample_rate =
pstr_input_config->aud_ch_pcm_cfg[0].sample_rate;
if (pstr_input_config->use_oam_element[0])
if (p_obj_mpeghe->config.num_oam_ch)
{
pstr_input_config->str_drc_cfg.str_uni_drc_config.str_channel_layout.base_ch_count +=
pstr_input_config->num_oam_ch[0];
Expand Down Expand Up @@ -1213,7 +1223,7 @@ static IA_ERRORCODE impeghe_set_config_params(ia_mpeghe_api_struct *p_obj_mpeghe
p_obj_mpeghe->config.str_ext_cfg_downmix_input = pstr_input_config->str_ext_cfg_downmix_input;
}

if ((pstr_input_config->use_oam_element[0]) || (pstr_input_config->use_hoa_element))
if ((p_obj_mpeghe->config.num_oam_ch) || (pstr_input_config->use_hoa_element))
{
p_obj_mpeghe->config.basic_bitrate =
p_obj_mpeghe->config.aud_ch * MINIMUM_BITRATE_PER_CHANNEL;
Expand Down Expand Up @@ -1742,10 +1752,14 @@ IA_ERRORCODE impeghe_create(pVOID pv_input, pVOID pv_output)
pstr_input_config->codec_mode = USAC_ONLY_FD;
}

if (1 == pstr_input_config->use_oam_element[0])
for (WORD32 i = 0; i < pstr_input_config->num_obj_sig_groups; i++)
{
// OAM is always in FD mode.
pstr_input_config->codec_mode = USAC_ONLY_FD;
if (1 == pstr_input_config->use_oam_element[i])
{
// OAM is always in FD mode.
pstr_input_config->codec_mode = USAC_ONLY_FD;
break;
}
}

/*Error*/
Expand Down
5 changes: 5 additions & 0 deletions encoder/impeghe_asc_write.c
Original file line number Diff line number Diff line change
Expand Up @@ -733,6 +733,11 @@ WORD32 impeghe_get_audiospecific_config_bytes(

break;
case 1:
while (pstr_audio_specific_config->num_objs_per_sig_group[obj_idx] == 0 &&
obj_idx < pstr_audio_specific_config->num_obj_sig_groups)
{
obj_idx++;
}
bit_cnt += impeghe_write_escape_value(
it_bit_buff, pstr_audio_specific_config->num_objs_per_sig_group[obj_idx++] - 1, 5, 8,
16);
Expand Down
43 changes: 27 additions & 16 deletions encoder/impeghe_enc_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -892,7 +892,7 @@ IA_ERRORCODE impeghe_add_mct_ext_element(ia_usac_encoder_config_struct *pstr_usa
{
pstr_usac_data->mct_data[grp].num_channels = pstr_asc->num_objs_per_sig_group[grp];
}
else if (grp == pstr_asc->num_ch_sig_groups + pstr_asc->num_obj_sig_groups)
else if (grp == pstr_asc->num_sig_grps - pstr_asc->num_hoa_sig_groups)
{
pstr_usac_data->mct_data[grp].num_channels = pstr_asc->num_hoas_per_sig_group[grp];
}
Expand Down Expand Up @@ -978,7 +978,7 @@ IA_ERRORCODE impeghe_add_mct_ext_element(ia_usac_encoder_config_struct *pstr_usa
*/
IA_ERRORCODE impeghe_add_oam_ext_element(ia_usac_encoder_config_struct *pstr_usac_config,
ia_usac_enc_state_struct *pstr_usac_state,
WORD32 sig_idx)
WORD32 sig_idx, WORD32 oam_ele_idx)
{
IA_ERRORCODE err_code;
WORD32 idx;
Expand Down Expand Up @@ -1010,7 +1010,7 @@ IA_ERRORCODE impeghe_add_oam_ext_element(ia_usac_encoder_config_struct *pstr_usa
#endif
pstr_oam_config.extra_objects = pstr_usac_config->extra_objects[sig_idx];

err_code = impeghe_obj_md_enc_init(&pstr_usac_data->str_oam_state[sig_idx], &pstr_oam_config);
err_code = impeghe_obj_md_enc_init(&pstr_usac_data->str_oam_state[oam_ele_idx], &pstr_oam_config);
if (err_code & IA_FATAL_ERROR)
{
return err_code;
Expand All @@ -1025,27 +1025,27 @@ IA_ERRORCODE impeghe_add_oam_ext_element(ia_usac_encoder_config_struct *pstr_usa
pstr_usac_elem_config->oam_has_core_length = pstr_usac_config->oam_has_core_length[sig_idx];
if (pstr_usac_config->oam_high_rate != 0)
{
pstr_usac_elem_config->oam_block_size = pstr_usac_data->str_oam_state[sig_idx].oam_block_size;
pstr_usac_elem_config->oam_block_size = pstr_usac_data->str_oam_state[oam_ele_idx].oam_block_size;
}
else
{
pstr_usac_elem_config->oam_block_size = pstr_usac_config->ccfl;
}

pstr_usac_elem_config->oam_has_scrn_rel_objs = pstr_usac_config->oam_has_scrn_rel_objs[sig_idx];
pstr_usac_elem_config->oam_num_objects = pstr_usac_data->str_oam_state[sig_idx].str_config.num_objects;
pstr_usac_elem_config->oam_num_objects = pstr_usac_data->str_oam_state[oam_ele_idx].str_config.num_objects;
for (idx = 0; idx < pstr_usac_elem_config->oam_num_objects; idx++)
{
pstr_usac_elem_config->oam_is_scrn_rel_obj[idx] =
pstr_usac_config->oam_is_scrn_rel_obj[idx];
}
pstr_usac_elem_config->oam_has_dyn_obj_priority =
pstr_usac_data->str_oam_state[sig_idx].str_config.has_dyn_obj_priority;
pstr_usac_data->str_oam_state[oam_ele_idx].str_config.has_dyn_obj_priority;
pstr_usac_elem_config->oam_has_uniform_spread =
pstr_usac_data->str_oam_state[sig_idx].str_config.has_uniform_spread;
pstr_usac_data->str_oam_state[oam_ele_idx].str_config.has_uniform_spread;

pstr_asc->num_audio_objs = pstr_usac_data->str_oam_state[sig_idx].str_config.num_objects;
//pstr_asc->num_audio_chs = pstr_usac_data->str_oam_state[sig_idx].str_config.num_channels;
pstr_asc->num_audio_objs = pstr_usac_data->str_oam_state[oam_ele_idx].str_config.num_objects;
//pstr_asc->num_audio_chs = pstr_usac_data->str_oam_state[oam_ele_idx].str_config.num_channels;

pstr_asc_usac_config->num_elements++;
pstr_asc_usac_config->num_ext_elements++;
Expand Down Expand Up @@ -1127,7 +1127,13 @@ IA_ERRORCODE impeghe_enc_init(ia_usac_encoder_config_struct *pstr_usac_config,
}

pstr_asc->num_sig_grps =
pstr_asc->num_ch_sig_groups + pstr_asc->num_obj_sig_groups + pstr_asc->num_hoa_sig_groups;
pstr_asc->num_ch_sig_groups + pstr_asc->num_hoa_sig_groups;

for (WORD32 i = 0; i < pstr_asc->num_obj_sig_groups; i++)
{
if (pstr_usac_config->use_oam_element[i])
pstr_asc->num_sig_grps++;
}

if (pstr_asc->num_hoa_sig_groups > 1)
{
Expand Down Expand Up @@ -1164,7 +1170,7 @@ IA_ERRORCODE impeghe_enc_init(ia_usac_encoder_config_struct *pstr_usac_config,
}
pstr_asc->channel_configuration = channel_config;

for (; g < pstr_asc->num_ch_sig_groups + pstr_asc->num_obj_sig_groups; g++)
for (; g < (pstr_asc->num_sig_grps - pstr_asc->num_hoa_sig_groups); g++)
{

pstr_asc->channel_configuration_grp[g] = 6; // Default value
Expand Down Expand Up @@ -1381,11 +1387,12 @@ IA_ERRORCODE impeghe_enc_init(ia_usac_encoder_config_struct *pstr_usac_config,
obj_ele_start = pstr_asc_usac_config->num_elements;
if (pstr_asc->num_obj_sig_groups > 0)
{
WORD32 active_oam_ele = 0;
for (j = 0; j < pstr_asc->num_obj_sig_groups; j++)
{
if (pstr_usac_config->use_oam_element[j] == 1)
{
IA_ERRORCODE err_code = impeghe_add_oam_ext_element(pstr_usac_config, pstr_usac_state, j);
IA_ERRORCODE err_code = impeghe_add_oam_ext_element(pstr_usac_config, pstr_usac_state, j, active_oam_ele);
if (err_code)
{
return err_code;
Expand All @@ -1399,6 +1406,7 @@ IA_ERRORCODE impeghe_enc_init(ia_usac_encoder_config_struct *pstr_usac_config,
i++;
ch_offset_idx++;
}
active_oam_ele++;
}
}
}
Expand Down Expand Up @@ -1574,7 +1582,7 @@ IA_ERRORCODE impeghe_enc_init(ia_usac_encoder_config_struct *pstr_usac_config,
}
}

if (1 == pstr_usac_config->use_oam_element[0])
if (pstr_usac_config->num_oam_elements > 0)
{
for (; el_id < tc_ele_start; el_id++)
{
Expand All @@ -1584,6 +1592,9 @@ IA_ERRORCODE impeghe_enc_init(ia_usac_encoder_config_struct *pstr_usac_config,
pstr_usac_data->str_qc_main.str_qc_data[i_ch].num_ch = 1;
pstr_usac_data->str_qc_main.str_qc_data[i_ch].ch_bitrate =
pstr_usac_config->oam_bitrate / pstr_usac_config->num_oam_ch;
pstr_usac_data->str_qc_main.str_qc_data[i_ch].avg_bits =
(pstr_usac_data->str_qc_main.str_qc_data[i_ch].ch_bitrate * FRAME_LEN_LONG) /
pstr_usac_config->sampling_rate;
i_ch++;
}
else if (ID_USAC_CPE ==
Expand All @@ -1593,11 +1604,11 @@ IA_ERRORCODE impeghe_enc_init(ia_usac_encoder_config_struct *pstr_usac_config,
pstr_usac_data->str_qc_main.str_qc_data[i_ch].num_ch = 2;
pstr_usac_data->str_qc_main.str_qc_data[i_ch].ch_bitrate =
2 * pstr_usac_config->oam_bitrate / pstr_usac_config->num_oam_ch;
pstr_usac_data->str_qc_main.str_qc_data[i_ch].avg_bits =
(pstr_usac_data->str_qc_main.str_qc_data[i_ch].ch_bitrate * FRAME_LEN_LONG) /
pstr_usac_config->sampling_rate;
i_ch++;
}
pstr_usac_data->str_qc_main.str_qc_data[i_ch].avg_bits =
(pstr_usac_data->str_qc_main.str_qc_data[i_ch].ch_bitrate * FRAME_LEN_LONG) /
pstr_usac_config->sampling_rate;
}
}

Expand Down
25 changes: 14 additions & 11 deletions encoder/impeghe_fd_quant.c
Original file line number Diff line number Diff line change
Expand Up @@ -351,21 +351,24 @@ static WORD32 impeghe_count_static_bits(ia_usac_data_struct *ptr_usac_data,
stat_bits += (ptr_usac_data->mct_data_bit_cnt * channels) / (ptr_usac_config->channels - 1);
}

if (ptr_usac_config->use_oam_element[0])
for (WORD32 o = 0; o <ptr_usac_config->num_obj_sig_groups; o++)
{
if (ptr_usac_config->use_oam_element[o])
{
#if 0
stat_bits += (ptr_usac_data->oam_data_bit_cnt) / (ptr_usac_config->channels);
stat_bits += (ptr_usac_data->oam_data_bit_cnt) / (ptr_usac_config->channels);
#else
WORD32 num_objs = 0;
for(i = 0; i < ptr_usac_data->obj_ele_idx; i++)
{
num_objs += ptr_usac_config->num_objects[i];
}
if (num_objs)
{
stat_bits += ptr_usac_data->oam_data_bit_cnt / num_objs;
}
WORD32 num_objs = 0;
for(i = 0; i < ptr_usac_data->obj_ele_idx; i++)
{
num_objs += ptr_usac_config->num_objects[i];
}
if (num_objs)
{
stat_bits += ptr_usac_data->oam_data_bit_cnt / num_objs;
}
#endif
}
}

return stat_bits;
Expand Down
Loading