blob: ef04db2f0be9e50a8b475ff631bedb0f0eeec47e [file] [log] [blame]
/******************************************************************************
*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*****************************************************************************
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "impd_type_def.h"
#include "impd_drc_uni_tables.h"
#include "impd_drc_uni_common.h"
#include "impd_drc_uni_interface.h"
#include "impd_drc_struct.h"
#include "impd_drc_uni_gain_dec.h"
#include "impd_drc_uni_loud_eq.h"
#include "impd_parametric_drc_dec.h"
#include "impd_drc_uni_multi_band.h"
#include "impd_drc_filter_bank.h"
#include "impd_drc_uni_process_audio.h"
#include "impd_drc_rom.h"
WORD32 impd_parametric_drc_instance_reset(
WORD32 instance_idx, ia_parametric_drc_instance_params_struct*
pstr_parametric_drc_instance_params) {
WORD32 err = 0;
if (pstr_parametric_drc_instance_params->parametric_drc_type ==
PARAM_DRC_TYPE_FF) {
ia_parametric_drc_type_ff_params_struct*
pstr_parametric_ffwd_type_drc_params =
&(pstr_parametric_drc_instance_params
->str_parametric_drc_type_ff_params);
err = impd_parametric_ffwd_type_drc_reset(
pstr_parametric_ffwd_type_drc_params);
if (err) return (err);
} else {
return (UNEXPECTED_ERROR);
}
return 0;
}
WORD32 impd_add_drc_band_audio(
ia_drc_instructions_struct* pstr_drc_instruction_arr,
const WORD32 drc_instructions_index,
ia_drc_params_struct* ia_drc_params_struct,
ia_audio_band_buffer_struct* audio_band_buffer, FLOAT32* audio_io_buf[]) {
WORD32 g, b, i, c;
FLOAT32 sum;
WORD32 signalIndex = 0;
FLOAT32** drcBandAudio;
FLOAT32** channel_audio;
ia_drc_instructions_struct* str_drc_instruction_str;
drcBandAudio = audio_band_buffer->non_interleaved_audio;
channel_audio = audio_io_buf;
if (drc_instructions_index >= 0) {
str_drc_instruction_str =
&(pstr_drc_instruction_arr[drc_instructions_index]);
} else {
return -1;
}
if (str_drc_instruction_str->drc_set_id > 0) {
for (c = 0; c < str_drc_instruction_str->audio_num_chan; c++)
{
g = str_drc_instruction_str->channel_group_of_ch[c];
if (g >= 0) {
for (i = 0; i < ia_drc_params_struct->drc_frame_size; i++) {
sum = 0.0f;
for (b = 0; b < str_drc_instruction_str->band_count_of_ch_group[g];
b++) {
sum += drcBandAudio[signalIndex + b][i];
}
channel_audio[c][i] = sum;
}
signalIndex += str_drc_instruction_str->band_count_of_ch_group[g];
} else {
signalIndex++;
}
}
} else {
for (c = 0; c < str_drc_instruction_str->audio_num_chan; c++)
{
for (i = 0; i < ia_drc_params_struct->drc_frame_size; i++) {
channel_audio[c][i] = drcBandAudio[c][i];
}
}
}
return (0);
}
WORD32 removeTables(void) { return (0); }
const ia_slope_code_table_struct* impd_get_slope_code_tbl_by_value(void) {
return (&(slopeCodeTableEntryByValue[0]));
}
FLOAT32 impd_decode_slope_idx(const WORD32 slopeCodeIndex) {
const ia_slope_code_table_struct* slopeCodeTable =
impd_get_slope_code_tbl_by_value();
return slopeCodeTable[slopeCodeIndex].value;
}
FLOAT32 impd_decode_slope_idx_magnitude(const WORD32 slopeCodeIndex) {
const ia_slope_code_table_struct* slopeCodeTable =
impd_get_slope_code_tbl_by_value();
return (FLOAT32)fabs((FLOAT64)slopeCodeTable[slopeCodeIndex].value);
}
WORD32 impd_get_multi_band_drc_present(ia_drc_config* pstr_drc_config,
WORD32 numSets[3],
WORD32 multiBandDrcPresent[3]) {
WORD32 err = 0, k, m;
for (k = 0; k < pstr_drc_config->drc_instructions_uni_drc_count; k++) {
if ((pstr_drc_config->str_drc_instruction_str[k].downmix_id[0] ==
ID_FOR_BASE_LAYOUT) ||
(pstr_drc_config->str_drc_instruction_str[k].drc_apply_to_dwnmix ==
0)) {
numSets[0]++;
} else if (pstr_drc_config->str_drc_instruction_str[k].downmix_id[0] ==
ID_FOR_ANY_DOWNMIX) {
numSets[1]++;
} else {
numSets[2]++;
}
for (m = 0;
m < pstr_drc_config->str_drc_instruction_str[k].num_drc_ch_groups;
m++) {
if (pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[0]
.gain_set_params[pstr_drc_config->str_drc_instruction_str
->gain_set_index_for_channel_group[m]]
.band_count > 1) {
if ((pstr_drc_config->str_drc_instruction_str[k].downmix_id[0] ==
ID_FOR_BASE_LAYOUT) ||
(pstr_drc_config->str_drc_instruction_str[k].drc_apply_to_dwnmix ==
0)) {
multiBandDrcPresent[0] = 1;
} else if (pstr_drc_config->str_drc_instruction_str[k].downmix_id[0] ==
ID_FOR_ANY_DOWNMIX) {
multiBandDrcPresent[1] = 1;
} else {
multiBandDrcPresent[2] = 1;
}
}
}
}
return err;
}