1 /****************************************************************************** 2 * 3 * Copyright (C) 2018 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ***************************************************************************** 18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19 */ 20 #include <stdio.h> 21 #include <string.h> 22 #include <math.h> 23 #include "impd_type_def.h" 24 #include "impd_drc_bitbuffer.h" 25 #include "impd_drc_extr_delta_coded_info.h" 26 #include "impd_drc_common.h" 27 #include "impd_drc_struct.h" 28 #include "impd_drc_parser.h" 29 #include "impd_drc_filter_bank.h" 30 #include "impd_drc_rom.h" 31 32 static VOID impd_parametric_drc_ffwd_init_drc_curve_params( 33 WORD32 drc_characteristic, ia_parametric_drc_type_feed_forward_struct* 34 str_parametric_drc_type_feed_forward) { 35 WORD32* node_level = str_parametric_drc_type_feed_forward->node_level; 36 WORD32* node_gain = str_parametric_drc_type_feed_forward->node_gain; 37 38 switch (drc_characteristic) { 39 case 7: 40 str_parametric_drc_type_feed_forward->node_count = 5; 41 node_level[0] = -22; 42 node_gain[0] = 6; 43 node_level[1] = -10; 44 node_gain[1] = 0; 45 node_level[2] = 10; 46 node_gain[2] = 0; 47 node_level[3] = 20; 48 node_gain[3] = -5; 49 node_level[4] = 40; 50 node_gain[4] = -24; 51 break; 52 case 8: 53 str_parametric_drc_type_feed_forward->node_count = 5; 54 node_level[0] = -12; 55 node_gain[0] = 6; 56 node_level[1] = 0; 57 node_gain[1] = 0; 58 node_level[2] = 5; 59 node_gain[2] = 0; 60 node_level[3] = 15; 61 node_gain[3] = -5; 62 node_level[4] = 35; 63 node_gain[4] = -24; 64 break; 65 case 9: 66 str_parametric_drc_type_feed_forward->node_count = 4; 67 node_level[0] = -34; 68 node_gain[0] = 12; 69 node_level[1] = -10; 70 node_gain[1] = 0; 71 node_level[2] = 10; 72 node_gain[2] = 0; 73 node_level[3] = 40; 74 node_gain[3] = -15; 75 break; 76 case 10: 77 str_parametric_drc_type_feed_forward->node_count = 5; 78 node_level[0] = -24; 79 node_gain[0] = 12; 80 node_level[1] = 0; 81 node_gain[1] = 0; 82 node_level[2] = 5; 83 node_gain[2] = 0; 84 node_level[3] = 15; 85 node_gain[3] = -5; 86 node_level[4] = 35; 87 node_gain[4] = -24; 88 break; 89 case 11: 90 str_parametric_drc_type_feed_forward->node_count = 5; 91 node_level[0] = -19; 92 node_gain[0] = 15; 93 node_level[1] = 0; 94 node_gain[1] = 0; 95 node_level[2] = 5; 96 node_gain[2] = 0; 97 node_level[3] = 15; 98 node_gain[3] = -5; 99 node_level[4] = 35; 100 node_gain[4] = -24; 101 break; 102 default: 103 str_parametric_drc_type_feed_forward->disable_paramteric_drc = 1; 104 } 105 106 return; 107 } 108 109 static VOID impd_parametric_drc_ffwd_init_drc_gain_smooth_params( 110 WORD32 drc_characteristic, ia_parametric_drc_type_feed_forward_struct* 111 str_parametric_drc_type_feed_forward) { 112 str_parametric_drc_type_feed_forward->gain_smooth_attack_time_slow = 100; 113 str_parametric_drc_type_feed_forward->gain_smooth_time_fast_present = 1; 114 str_parametric_drc_type_feed_forward->gain_smooth_attack_time_fast = 10; 115 str_parametric_drc_type_feed_forward->gain_smooth_threshold_present = 1; 116 str_parametric_drc_type_feed_forward->gain_smooth_hold_off_count_present = 1; 117 str_parametric_drc_type_feed_forward->gain_smooth_hold_off = 10; 118 119 switch (drc_characteristic) { 120 case 7: 121 case 8: 122 case 9: 123 str_parametric_drc_type_feed_forward->gain_smooth_release_time_slow = 124 3000; 125 str_parametric_drc_type_feed_forward->gain_smooth_release_time_fast = 126 1000; 127 str_parametric_drc_type_feed_forward->gain_smooth_attack_threshold = 15; 128 str_parametric_drc_type_feed_forward->gain_smooth_rel_threshold = 20; 129 break; 130 case 10: 131 str_parametric_drc_type_feed_forward->gain_smooth_release_time_slow = 132 10000; 133 str_parametric_drc_type_feed_forward->gain_smooth_release_time_fast = 134 1000; 135 str_parametric_drc_type_feed_forward->gain_smooth_attack_threshold = 15; 136 str_parametric_drc_type_feed_forward->gain_smooth_rel_threshold = 20; 137 break; 138 case 11: 139 str_parametric_drc_type_feed_forward->gain_smooth_release_time_slow = 140 1000; 141 str_parametric_drc_type_feed_forward->gain_smooth_release_time_fast = 200; 142 str_parametric_drc_type_feed_forward->gain_smooth_attack_threshold = 10; 143 str_parametric_drc_type_feed_forward->gain_smooth_rel_threshold = 10; 144 break; 145 default: 146 str_parametric_drc_type_feed_forward->gain_smooth_release_time_slow = 147 3000; 148 str_parametric_drc_type_feed_forward->gain_smooth_release_time_fast = 149 1000; 150 str_parametric_drc_type_feed_forward->gain_smooth_attack_threshold = 15; 151 str_parametric_drc_type_feed_forward->gain_smooth_rel_threshold = 20; 152 break; 153 } 154 155 return; 156 } 157 158 static WORD32 impd_parse_parametric_drc_ffwd( 159 ia_bit_buf_struct* it_bit_buff, WORD32 parametric_drc_frame_size, 160 ia_parametric_drc_type_feed_forward_struct* 161 str_parametric_drc_type_feed_forward) { 162 WORD32 i = 0, tmp = 0; 163 // WORD32 err = 0; 164 165 str_parametric_drc_type_feed_forward->disable_paramteric_drc = 0; 166 167 tmp = impd_read_bits_buf(it_bit_buff, 3); 168 if (it_bit_buff->error) return it_bit_buff->error; 169 170 str_parametric_drc_type_feed_forward->level_estim_k_weighting_type = 171 (tmp >> 1) & 3; 172 str_parametric_drc_type_feed_forward->level_estim_integration_time_present = 173 tmp & 1; 174 175 if (str_parametric_drc_type_feed_forward 176 ->level_estim_integration_time_present) { 177 tmp = impd_read_bits_buf(it_bit_buff, 6); 178 if (it_bit_buff->error) return it_bit_buff->error; 179 str_parametric_drc_type_feed_forward->level_estim_integration_time = 180 (tmp + 1) * parametric_drc_frame_size; 181 } else { 182 str_parametric_drc_type_feed_forward->level_estim_integration_time = 183 parametric_drc_frame_size; 184 } 185 186 str_parametric_drc_type_feed_forward->drc_curve_definition_type = 187 impd_read_bits_buf(it_bit_buff, 1); 188 if (it_bit_buff->error) return it_bit_buff->error; 189 190 if (str_parametric_drc_type_feed_forward->drc_curve_definition_type == 0) { 191 str_parametric_drc_type_feed_forward->drc_characteristic = 192 impd_read_bits_buf(it_bit_buff, 7); 193 if (it_bit_buff->error) return it_bit_buff->error; 194 impd_parametric_drc_ffwd_init_drc_curve_params( 195 str_parametric_drc_type_feed_forward->drc_characteristic, 196 str_parametric_drc_type_feed_forward); 197 } else { 198 str_parametric_drc_type_feed_forward->drc_characteristic = 0; 199 200 tmp = impd_read_bits_buf(it_bit_buff, 15); 201 if (it_bit_buff->error) return it_bit_buff->error; 202 203 str_parametric_drc_type_feed_forward->node_count = ((tmp >> 12) & 3) + 2; 204 str_parametric_drc_type_feed_forward->node_level[0] = 205 -11 - ((tmp >> 6) & 0x3f); 206 str_parametric_drc_type_feed_forward->node_gain[0] = (tmp & 0x3f) - 39; 207 208 for (i = 1; i < str_parametric_drc_type_feed_forward->node_count; i++) { 209 tmp = impd_read_bits_buf(it_bit_buff, 11); 210 if (it_bit_buff->error) return it_bit_buff->error; 211 212 str_parametric_drc_type_feed_forward->node_level[i] = 213 str_parametric_drc_type_feed_forward->node_level[i - 1] + 1 + 214 ((tmp >> 6) & 0x1f); 215 str_parametric_drc_type_feed_forward->node_gain[i] = (tmp & 0x3f) - 39; 216 } 217 } 218 219 impd_parametric_drc_ffwd_init_drc_gain_smooth_params( 220 str_parametric_drc_type_feed_forward->drc_characteristic, 221 str_parametric_drc_type_feed_forward); 222 223 str_parametric_drc_type_feed_forward->drc_gain_smooth_parameters_present = 224 impd_read_bits_buf(it_bit_buff, 1); 225 if (it_bit_buff->error) return it_bit_buff->error; 226 if (str_parametric_drc_type_feed_forward 227 ->drc_gain_smooth_parameters_present) { 228 tmp = impd_read_bits_buf(it_bit_buff, 17); 229 if (it_bit_buff->error) return it_bit_buff->error; 230 231 str_parametric_drc_type_feed_forward->gain_smooth_attack_time_slow = 232 ((tmp >> 9) & 0xff) * 5; 233 str_parametric_drc_type_feed_forward->gain_smooth_release_time_slow = 234 ((tmp >> 1) & 0xff) * 40; 235 str_parametric_drc_type_feed_forward->gain_smooth_time_fast_present = 236 tmp & 1; 237 238 if (str_parametric_drc_type_feed_forward->gain_smooth_time_fast_present) { 239 tmp = impd_read_bits_buf(it_bit_buff, 17); 240 if (it_bit_buff->error) return it_bit_buff->error; 241 242 str_parametric_drc_type_feed_forward->gain_smooth_attack_time_fast = 243 ((tmp >> 9) & 0xff) * 5; 244 str_parametric_drc_type_feed_forward->gain_smooth_release_time_fast = 245 ((tmp >> 1) & 0xff) * 20; 246 str_parametric_drc_type_feed_forward->gain_smooth_threshold_present = 247 tmp & 1; 248 249 if (str_parametric_drc_type_feed_forward->gain_smooth_threshold_present) { 250 str_parametric_drc_type_feed_forward->gain_smooth_attack_threshold = 251 impd_read_bits_buf(it_bit_buff, 5); 252 if (it_bit_buff->error) return it_bit_buff->error; 253 if (str_parametric_drc_type_feed_forward 254 ->gain_smooth_attack_threshold == 31) { 255 str_parametric_drc_type_feed_forward->gain_smooth_attack_threshold = 256 1000; 257 } 258 259 str_parametric_drc_type_feed_forward->gain_smooth_rel_threshold = 260 impd_read_bits_buf(it_bit_buff, 5); 261 if (it_bit_buff->error) return it_bit_buff->error; 262 if (str_parametric_drc_type_feed_forward->gain_smooth_rel_threshold == 263 31) { 264 str_parametric_drc_type_feed_forward->gain_smooth_rel_threshold = 265 1000; 266 } 267 } 268 } else { 269 str_parametric_drc_type_feed_forward->gain_smooth_attack_time_fast = 270 str_parametric_drc_type_feed_forward->gain_smooth_attack_time_slow; 271 str_parametric_drc_type_feed_forward->gain_smooth_release_time_fast = 272 str_parametric_drc_type_feed_forward->gain_smooth_release_time_slow; 273 } 274 275 str_parametric_drc_type_feed_forward->gain_smooth_hold_off_count_present = 276 impd_read_bits_buf(it_bit_buff, 1); 277 if (it_bit_buff->error) return it_bit_buff->error; 278 279 if (str_parametric_drc_type_feed_forward 280 ->gain_smooth_hold_off_count_present) { 281 str_parametric_drc_type_feed_forward->gain_smooth_hold_off = 282 impd_read_bits_buf(it_bit_buff, 7); 283 if (it_bit_buff->error) return it_bit_buff->error; 284 } 285 } 286 return 0; 287 } 288 289 static WORD32 impd_parse_parametric_drc_lim( 290 ia_bit_buf_struct* it_bit_buff, 291 ia_parametric_drc_lim_struct* parametric_drc_lim) { 292 // WORD32 err = 0; 293 WORD32 tmp = 0; 294 295 parametric_drc_lim->disable_paramteric_drc = 0; 296 297 parametric_drc_lim->parametric_lim_threshold_present = 298 impd_read_bits_buf(it_bit_buff, 1); 299 if (it_bit_buff->error) return it_bit_buff->error; 300 301 if (parametric_drc_lim->parametric_lim_threshold_present) { 302 tmp = impd_read_bits_buf(it_bit_buff, 8); 303 if (it_bit_buff->error) return it_bit_buff->error; 304 parametric_drc_lim->parametric_lim_threshold = -tmp * 0.125f; 305 } else { 306 parametric_drc_lim->parametric_lim_threshold = 307 PARAM_DRC_TYPE_LIM_THRESHOLD_DEFAULT; 308 } 309 310 parametric_drc_lim->parametric_lim_release_present = 311 impd_read_bits_buf(it_bit_buff, 1); 312 if (it_bit_buff->error) return it_bit_buff->error; 313 if (parametric_drc_lim->parametric_lim_release_present) { 314 tmp = impd_read_bits_buf(it_bit_buff, 8); 315 if (it_bit_buff->error) return it_bit_buff->error; 316 parametric_drc_lim->parametric_lim_release = tmp * 10; 317 } else { 318 parametric_drc_lim->parametric_lim_release = 319 PARAM_DRC_TYPE_LIM_RELEASE_DEFAULT; 320 } 321 322 parametric_drc_lim->parametric_lim_attack = PARAM_DRC_TYPE_LIM_ATTACK_DEFAULT; 323 parametric_drc_lim->drc_characteristic = 0; 324 325 return 0; 326 } 327 328 WORD32 329 impd_parametric_drc_parse_gain_set_params( 330 ia_bit_buf_struct* it_bit_buff, ia_drc_config* drc_config, 331 ia_parametric_drc_gain_set_params_struct* 332 str_parametric_drc_gain_set_params) { 333 WORD32 i = 0, bsDrcInputLoudness = 0, bs_channel_weight = 0, temp; 334 // WORD32 err = 0; 335 temp = impd_read_bits_buf(it_bit_buff, 7); 336 if (it_bit_buff->error) return it_bit_buff->error; 337 338 str_parametric_drc_gain_set_params->parametric_drc_id = (temp >> 3) & 0xf; 339 str_parametric_drc_gain_set_params->side_chain_config_type = temp & 7; 340 341 if (str_parametric_drc_gain_set_params->side_chain_config_type) { 342 temp = impd_read_bits_buf(it_bit_buff, 8); 343 if (it_bit_buff->error) return it_bit_buff->error; 344 345 str_parametric_drc_gain_set_params->downmix_id = (temp >> 1) & 0x7f; 346 str_parametric_drc_gain_set_params->level_estim_channel_weight_format = 347 temp & 1; 348 349 if (str_parametric_drc_gain_set_params->downmix_id == ID_FOR_BASE_LAYOUT) { 350 str_parametric_drc_gain_set_params->ch_count_from_dwnmix_id = 351 drc_config->channel_layout.base_channel_count; 352 } else if (str_parametric_drc_gain_set_params->downmix_id == 353 ID_FOR_ANY_DOWNMIX) { 354 str_parametric_drc_gain_set_params->ch_count_from_dwnmix_id = 1; 355 } else { 356 for (i = 0; i < drc_config->dwnmix_instructions_count; i++) { 357 if (str_parametric_drc_gain_set_params->downmix_id == 358 drc_config->dwnmix_instructions[i].downmix_id) 359 break; 360 } 361 if (i == drc_config->dwnmix_instructions_count) { 362 /* dwnmix_instructions not found */ 363 return (UNEXPECTED_ERROR); 364 } 365 str_parametric_drc_gain_set_params->ch_count_from_dwnmix_id = 366 drc_config->dwnmix_instructions[i].target_channel_count; 367 } 368 369 for (i = 0; i < str_parametric_drc_gain_set_params->ch_count_from_dwnmix_id; 370 i++) { 371 if (str_parametric_drc_gain_set_params 372 ->level_estim_channel_weight_format == 0) { 373 str_parametric_drc_gain_set_params->level_estim_ch_weight[i] = 374 (FLOAT32)impd_read_bits_buf(it_bit_buff, 1); 375 if (it_bit_buff->error) return it_bit_buff->error; 376 } else { 377 bs_channel_weight = impd_read_bits_buf(it_bit_buff, 4); 378 if (it_bit_buff->error) return it_bit_buff->error; 379 str_parametric_drc_gain_set_params->level_estim_ch_weight[i] = 380 (FLOAT32)pow(10.0f, 0.05f * channel_weight[bs_channel_weight]); 381 } 382 } 383 } else { 384 str_parametric_drc_gain_set_params->downmix_id = 0; 385 str_parametric_drc_gain_set_params->ch_count_from_dwnmix_id = 0; 386 } 387 388 str_parametric_drc_gain_set_params->drc_input_loudness_present = 389 impd_read_bits_buf(it_bit_buff, 1); 390 if (it_bit_buff->error) return it_bit_buff->error; 391 392 if (str_parametric_drc_gain_set_params->drc_input_loudness_present) { 393 bsDrcInputLoudness = impd_read_bits_buf(it_bit_buff, 8); 394 if (it_bit_buff->error) return it_bit_buff->error; 395 str_parametric_drc_gain_set_params->drc_input_loudness = 396 -57.75f + bsDrcInputLoudness * 0.25f; 397 } 398 399 return 0; 400 } 401 402 static WORD32 impd_parametric_drc_gen_virtual_gain_sets( 403 ia_drc_config* drc_config) { 404 WORD32 i = 0, j = 0, c1 = -1, c0 = -1, parametric_drc_id = 0, 405 drc_characteristic = 0; 406 ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc; 407 ia_parametric_drc_instructions_struct* str_parametric_drc_instructions; 408 ia_drc_coeff_parametric_drc_struct* str_drc_coeff_param_drc = 409 &(drc_config->str_drc_config_ext.str_drc_coeff_param_drc); 410 411 for (i = 0; i < drc_config->drc_coefficients_drc_count; i++) { 412 if (drc_config->str_p_loc_drc_coefficients_uni_drc[i].drc_location == 413 str_drc_coeff_param_drc->drc_location) { 414 if (drc_config->str_p_loc_drc_coefficients_uni_drc[i].version == 0) { 415 c0 = i; 416 } else { 417 c1 = i; 418 } 419 } 420 } 421 if (c1 >= 0) { 422 str_p_loc_drc_coefficients_uni_drc = 423 &(drc_config->str_p_loc_drc_coefficients_uni_drc[c1]); 424 } else if (c0 >= 0) { 425 str_p_loc_drc_coefficients_uni_drc = 426 &(drc_config->str_p_loc_drc_coefficients_uni_drc[c0]); 427 } else { 428 str_p_loc_drc_coefficients_uni_drc = 429 &drc_config->str_p_loc_drc_coefficients_uni_drc 430 [drc_config->drc_coefficients_drc_count]; 431 432 str_p_loc_drc_coefficients_uni_drc->version = 1; 433 str_p_loc_drc_coefficients_uni_drc->drc_location = 434 str_drc_coeff_param_drc->drc_location; 435 str_p_loc_drc_coefficients_uni_drc->drc_frame_size_present = 0; 436 437 str_p_loc_drc_coefficients_uni_drc->gain_set_count = 0; 438 str_p_loc_drc_coefficients_uni_drc->gain_set_count_plus = 0; 439 440 str_p_loc_drc_coefficients_uni_drc->drc_characteristic_left_present = 0; 441 str_p_loc_drc_coefficients_uni_drc->drc_characteristic_right_present = 0; 442 str_p_loc_drc_coefficients_uni_drc->shape_filters_present = 0; 443 str_p_loc_drc_coefficients_uni_drc->gain_sequence_count = 0; 444 drc_config->drc_coefficients_drc_count += 1; 445 } 446 str_p_loc_drc_coefficients_uni_drc->gain_set_count_plus = 447 str_p_loc_drc_coefficients_uni_drc->gain_set_count + 448 str_drc_coeff_param_drc->parametric_drc_gain_set_count; 449 for (i = str_p_loc_drc_coefficients_uni_drc->gain_set_count; 450 i < str_p_loc_drc_coefficients_uni_drc->gain_set_count_plus; i++) { 451 str_p_loc_drc_coefficients_uni_drc->gain_set_params[i].band_count = 1; 452 453 parametric_drc_id = 454 drc_config->str_drc_config_ext.str_drc_coeff_param_drc 455 .str_parametric_drc_gain_set_params 456 [i - str_p_loc_drc_coefficients_uni_drc->gain_set_count] 457 .parametric_drc_id; 458 459 for (j = 0; 460 j < drc_config->str_drc_config_ext.parametric_drc_instructions_count; 461 j++) { 462 if (parametric_drc_id == 463 drc_config->str_drc_config_ext.str_parametric_drc_instructions[j] 464 .parametric_drc_id) 465 break; 466 } 467 if (j == drc_config->str_drc_config_ext.parametric_drc_instructions_count) { 468 /* str_parametric_drc_instructions not found */ 469 return (UNEXPECTED_ERROR); 470 } 471 str_parametric_drc_instructions = 472 &drc_config->str_drc_config_ext.str_parametric_drc_instructions[j]; 473 474 drc_characteristic = 0; 475 if (str_parametric_drc_instructions->parametric_drc_preset_id_present) { 476 drc_characteristic = str_parametric_drc_instructions->drc_characteristic; 477 } else if (str_parametric_drc_instructions->parametric_drc_type == 478 PARAM_DRC_TYPE_FF) { 479 if (str_parametric_drc_instructions->str_parametric_drc_type_feed_forward 480 .drc_curve_definition_type == 0) { 481 drc_characteristic = 482 str_parametric_drc_instructions 483 ->str_parametric_drc_type_feed_forward.drc_characteristic; 484 } 485 } 486 if (drc_characteristic != 0) { 487 str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 488 .gain_params[0] 489 .drc_characteristic_present = 1; 490 str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 491 .gain_params[0] 492 .drc_characteristic_format_is_cicp = 1; 493 str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 494 .gain_params[0] 495 .drc_characteristic = drc_characteristic; 496 } else { 497 str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 498 .gain_params[0] 499 .drc_characteristic_present = 0; 500 str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 501 .gain_params[0] 502 .drc_characteristic_format_is_cicp = 0; 503 str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 504 .gain_params[0] 505 .drc_characteristic = 0; 506 } 507 } 508 509 return 0; 510 } 511 512 static WORD32 impd_parametic_drc_parse_coeff( 513 ia_bit_buf_struct* it_bit_buff, ia_drc_config* drc_config, 514 ia_drc_coeff_parametric_drc_struct* str_drc_coeff_param_drc) { 515 WORD32 i = 0, err = 0, code = 0, mu = 0, nu = 0, temp; 516 517 temp = impd_read_bits_buf(it_bit_buff, 5); 518 if (it_bit_buff->error) return it_bit_buff->error; 519 520 str_drc_coeff_param_drc->drc_location = (temp >> 1) & 0xf; 521 str_drc_coeff_param_drc->parametric_drc_frame_size_format = temp & 1; 522 523 if (str_drc_coeff_param_drc->parametric_drc_frame_size) { 524 code = impd_read_bits_buf(it_bit_buff, 15); 525 if (it_bit_buff->error) return it_bit_buff->error; 526 str_drc_coeff_param_drc->parametric_drc_frame_size = code + 1; 527 } else { 528 code = impd_read_bits_buf(it_bit_buff, 4); 529 if (it_bit_buff->error) return it_bit_buff->error; 530 str_drc_coeff_param_drc->parametric_drc_frame_size = 1 << code; 531 } 532 533 str_drc_coeff_param_drc->parametric_drc_delay_max_present = 534 impd_read_bits_buf(it_bit_buff, 1); 535 if (str_drc_coeff_param_drc->parametric_drc_delay_max_present) { 536 temp = impd_read_bits_buf(it_bit_buff, 8); 537 if (it_bit_buff->error) return it_bit_buff->error; 538 539 mu = (temp >> 3) & 0x1f; 540 nu = temp & 3; 541 542 str_drc_coeff_param_drc->parametric_drc_delay_max = 16 * mu * (1 << nu); 543 } 544 545 temp = impd_read_bits_buf(it_bit_buff, 7); 546 if (it_bit_buff->error) return it_bit_buff->error; 547 548 str_drc_coeff_param_drc->reset_parametric_drc = (temp >> 6) & 1; 549 str_drc_coeff_param_drc->parametric_drc_gain_set_count = temp & 0x3f; 550 551 if (str_drc_coeff_param_drc->parametric_drc_gain_set_count > 552 SEQUENCE_COUNT_MAX) 553 return (UNEXPECTED_ERROR); 554 555 for (i = 0; i < str_drc_coeff_param_drc->parametric_drc_gain_set_count; i++) { 556 err = impd_parametric_drc_parse_gain_set_params( 557 it_bit_buff, drc_config, 558 &(str_drc_coeff_param_drc->str_parametric_drc_gain_set_params[i])); 559 if (err) return (err); 560 } 561 562 return 0; 563 } 564 565 static WORD32 impd_parse_parametric_drc_instructions( 566 ia_bit_buf_struct* it_bit_buff, WORD32 parametric_drc_frame_size, 567 ia_parametric_drc_instructions_struct* str_parametric_drc_instructions) { 568 WORD32 i = 0, err = 0, temp; 569 WORD32 bit_size_len, bit_size, other_bit; 570 571 str_parametric_drc_instructions->drc_characteristic = 0; 572 str_parametric_drc_instructions->disable_paramteric_drc = 0; 573 574 temp = impd_read_bits_buf(it_bit_buff, 5); 575 if (it_bit_buff->error) return it_bit_buff->error; 576 577 str_parametric_drc_instructions->parametric_drc_id = (temp >> 1) & 0xf; 578 str_parametric_drc_instructions->parametric_drc_look_ahead_flag = temp & 1; 579 580 if (str_parametric_drc_instructions->parametric_drc_look_ahead_flag) { 581 str_parametric_drc_instructions->parametric_drc_look_ahead = 582 impd_read_bits_buf(it_bit_buff, 7); 583 if (it_bit_buff->error) return it_bit_buff->error; 584 } else { 585 str_parametric_drc_instructions->parametric_drc_look_ahead = 0; 586 } 587 588 str_parametric_drc_instructions->parametric_drc_preset_id_present = 589 impd_read_bits_buf(it_bit_buff, 1); 590 if (it_bit_buff->error) return it_bit_buff->error; 591 592 if (str_parametric_drc_instructions->parametric_drc_preset_id_present) { 593 str_parametric_drc_instructions->parametric_drc_preset_id = 594 impd_read_bits_buf(it_bit_buff, 7); 595 if (it_bit_buff->error) return it_bit_buff->error; 596 597 switch (str_parametric_drc_instructions->parametric_drc_preset_id) { 598 case 0: 599 case 1: 600 case 2: 601 case 3: 602 case 4: 603 str_parametric_drc_instructions->drc_characteristic = 604 str_parametric_drc_instructions->parametric_drc_preset_id + 7; 605 str_parametric_drc_instructions->parametric_drc_type = 606 PARAM_DRC_TYPE_FF; 607 608 str_parametric_drc_instructions->str_parametric_drc_type_feed_forward 609 .level_estim_k_weighting_type = 2; 610 str_parametric_drc_instructions->str_parametric_drc_type_feed_forward 611 .level_estim_integration_time = parametric_drc_frame_size; 612 613 impd_parametric_drc_ffwd_init_drc_curve_params( 614 str_parametric_drc_instructions->drc_characteristic, 615 &str_parametric_drc_instructions 616 ->str_parametric_drc_type_feed_forward); 617 impd_parametric_drc_ffwd_init_drc_gain_smooth_params( 618 str_parametric_drc_instructions->drc_characteristic, 619 &str_parametric_drc_instructions 620 ->str_parametric_drc_type_feed_forward); 621 622 break; 623 default: 624 str_parametric_drc_instructions->disable_paramteric_drc = 1; 625 break; 626 } 627 } else { 628 str_parametric_drc_instructions->parametric_drc_type = 629 impd_read_bits_buf(it_bit_buff, 3); 630 if (it_bit_buff->error) return it_bit_buff->error; 631 632 if (str_parametric_drc_instructions->parametric_drc_type == 633 PARAM_DRC_TYPE_FF) { 634 err = impd_parse_parametric_drc_ffwd( 635 it_bit_buff, parametric_drc_frame_size, 636 &(str_parametric_drc_instructions 637 ->str_parametric_drc_type_feed_forward)); 638 if (err) return (err); 639 str_parametric_drc_instructions->disable_paramteric_drc = 640 str_parametric_drc_instructions->str_parametric_drc_type_feed_forward 641 .disable_paramteric_drc; 642 str_parametric_drc_instructions->drc_characteristic = 643 str_parametric_drc_instructions->str_parametric_drc_type_feed_forward 644 .drc_characteristic; 645 } else if (str_parametric_drc_instructions->parametric_drc_type == 646 PARAM_DRC_TYPE_LIM) { 647 err = impd_parse_parametric_drc_lim( 648 it_bit_buff, &(str_parametric_drc_instructions->parametric_drc_lim)); 649 if (err) return (err); 650 str_parametric_drc_instructions->disable_paramteric_drc = 651 str_parametric_drc_instructions->parametric_drc_lim 652 .disable_paramteric_drc; 653 str_parametric_drc_instructions->drc_characteristic = 654 str_parametric_drc_instructions->parametric_drc_lim 655 .drc_characteristic; 656 if (str_parametric_drc_instructions->parametric_drc_look_ahead_flag) { 657 str_parametric_drc_instructions->parametric_drc_lim 658 .parametric_lim_attack = 659 str_parametric_drc_instructions->parametric_drc_look_ahead; 660 } 661 } else { 662 bit_size_len = impd_read_bits_buf(it_bit_buff, 3) + 4; 663 if (it_bit_buff->error) return it_bit_buff->error; 664 665 bit_size = impd_read_bits_buf(it_bit_buff, bit_size_len); 666 if (it_bit_buff->error) return it_bit_buff->error; 667 str_parametric_drc_instructions->len_bit_size = bit_size + 1; 668 669 switch (str_parametric_drc_instructions->parametric_drc_type) { 670 default: 671 str_parametric_drc_instructions->disable_paramteric_drc = 1; 672 for (i = 0; i < str_parametric_drc_instructions->len_bit_size; i++) { 673 other_bit = impd_read_bits_buf(it_bit_buff, 1); 674 if (it_bit_buff->error) return it_bit_buff->error; 675 } 676 break; 677 } 678 } 679 } 680 681 return 0; 682 } 683 684 WORD32 impd_parse_loud_info_set_ext_eq( 685 ia_bit_buf_struct* it_bit_buff, 686 ia_drc_loudness_info_set_struct* loudness_info_set) { 687 WORD32 err, i, offset, version = 1, temp; 688 WORD32 loudness_info_v1_album_cnt, loudness_info_v1_cnt; 689 690 temp = impd_read_bits_buf(it_bit_buff, 12); 691 if (it_bit_buff->error) return it_bit_buff->error; 692 693 loudness_info_v1_album_cnt = (temp >> 6) & 0x3f; 694 loudness_info_v1_cnt = temp & 0x3f; 695 696 offset = loudness_info_set->loudness_info_album_count; 697 loudness_info_set->loudness_info_album_count += loudness_info_v1_album_cnt; 698 if ((offset + loudness_info_v1_album_cnt) > LOUDNESS_INFO_COUNT_MAX) 699 return (UNEXPECTED_ERROR); 700 for (i = 0; i < loudness_info_v1_album_cnt; i++) { 701 err = impd_parse_loudness_info( 702 it_bit_buff, version, 703 &loudness_info_set->str_loudness_info_album[i + offset]); 704 if (err) return (err); 705 } 706 offset = loudness_info_set->loudness_info_count; 707 loudness_info_set->loudness_info_count += loudness_info_v1_cnt; 708 if (offset + loudness_info_v1_cnt > LOUDNESS_INFO_COUNT_MAX) 709 return (UNEXPECTED_ERROR); 710 for (i = 0; i < loudness_info_v1_cnt; i++) { 711 err = impd_parse_loudness_info( 712 it_bit_buff, version, &loudness_info_set->loudness_info[i + offset]); 713 if (err) return (err); 714 } 715 return (0); 716 } 717 718 WORD32 impd_parse_ch_layout(ia_bit_buf_struct* it_bit_buff, 719 ia_drc_params_bs_dec_struct* ia_drc_params_struct, 720 ia_channel_layout_struct* channel_layout) { 721 // WORD32 err = 0; 722 WORD32 i; 723 724 channel_layout->base_channel_count = impd_read_bits_buf(it_bit_buff, 7); 725 if (it_bit_buff->error) return it_bit_buff->error; 726 if (ia_drc_params_struct->lfe_channel_map_count != -1 && 727 channel_layout->base_channel_count != 728 ia_drc_params_struct->lfe_channel_map_count) { 729 return (UNEXPECTED_ERROR); 730 } 731 channel_layout->layout_signaling_present = impd_read_bits_buf(it_bit_buff, 1); 732 if (it_bit_buff->error) return it_bit_buff->error; 733 734 if (channel_layout->layout_signaling_present) { 735 channel_layout->defined_layout = impd_read_bits_buf(it_bit_buff, 8); 736 if (it_bit_buff->error) return it_bit_buff->error; 737 738 if (channel_layout->defined_layout == 0) { 739 for (i = 0; i < channel_layout->base_channel_count; i++) { 740 channel_layout->speaker_position[i] = 741 impd_read_bits_buf(it_bit_buff, 7); 742 if (it_bit_buff->error) return it_bit_buff->error; 743 if (channel_layout->speaker_position[i] == 3 || 744 channel_layout->speaker_position[i] == 26) { 745 ia_drc_params_struct->lfe_channel_map[i] = 1; 746 } else { 747 ia_drc_params_struct->lfe_channel_map[i] = 0; 748 } 749 } 750 } 751 } 752 753 return (0); 754 } 755 756 WORD32 757 impd_parse_dwnmix_instructions( 758 ia_bit_buf_struct* it_bit_buff, WORD32 version, 759 ia_drc_params_bs_dec_struct* ia_drc_params_struct, 760 ia_channel_layout_struct* channel_layout, 761 ia_downmix_instructions_struct* dwnmix_instructions) { 762 // WORD32 err = 0; 763 WORD32 i, j, k, temp; 764 765 temp = impd_read_bits_buf(it_bit_buff, 23); 766 if (it_bit_buff->error) return it_bit_buff->error; 767 768 dwnmix_instructions->downmix_id = (temp >> 16) & 0x7f; 769 dwnmix_instructions->target_channel_count = (temp >> 9) & 0x7f; 770 dwnmix_instructions->target_layout = (temp >> 1) & 0xff; 771 dwnmix_instructions->downmix_coefficients_present = temp & 1; 772 773 if (dwnmix_instructions->downmix_coefficients_present) { 774 if (version == 0) { 775 WORD32 dmix_coeff; 776 k = 0; 777 for (i = 0; i < dwnmix_instructions->target_channel_count; i++) { 778 for (j = 0; j < channel_layout->base_channel_count; j++) { 779 dmix_coeff = impd_read_bits_buf(it_bit_buff, 4); 780 if (it_bit_buff->error) return it_bit_buff->error; 781 782 if (k >= DOWNMIX_COEFF_COUNT_MAX) return (UNEXPECTED_ERROR); 783 if (ia_drc_params_struct->lfe_channel_map[j]) { 784 dwnmix_instructions->downmix_coefficient[k] = 785 (FLOAT32)pow(10.0f, 0.05f * dwnmix_coeff_lfe[dmix_coeff]); 786 } else { 787 dwnmix_instructions->downmix_coefficient[k] = 788 (FLOAT32)pow(10.0f, 0.05f * dwnmix_coeff[dmix_coeff]); 789 } 790 k++; 791 } 792 } 793 } else { 794 WORD32 dmix_coeff_v1, bs_dmix_offset; 795 FLOAT32 a, b, dmix_offset, sum; 796 797 bs_dmix_offset = impd_read_bits_buf(it_bit_buff, 4); 798 if (it_bit_buff->error) return it_bit_buff->error; 799 k = 0; 800 801 for (i = 0; i < dwnmix_instructions->target_channel_count; i++) { 802 for (j = 0; j < channel_layout->base_channel_count; j++) { 803 dmix_coeff_v1 = impd_read_bits_buf(it_bit_buff, 5); 804 if (it_bit_buff->error) return it_bit_buff->error; 805 if (k >= DOWNMIX_COEFF_COUNT_MAX) return (UNEXPECTED_ERROR); 806 dwnmix_instructions->downmix_coefficient[k] = 807 dwnmix_coeff_v1[dmix_coeff_v1]; 808 k++; 809 } 810 } 811 switch (bs_dmix_offset) { 812 case 0: 813 dmix_offset = 0.0f; 814 break; 815 case 1: 816 a = 20.0f * (FLOAT32)log10( 817 (FLOAT32)dwnmix_instructions->target_channel_count / 818 (FLOAT32)channel_layout->base_channel_count); 819 dmix_offset = 0.5f * (FLOAT32)floor(0.5f + a); 820 break; 821 case 2: 822 a = 20.0f * (FLOAT32)log10( 823 (FLOAT32)dwnmix_instructions->target_channel_count / 824 (FLOAT32)channel_layout->base_channel_count); 825 dmix_offset = 0.5f * (FLOAT32)floor(0.5f + 2.0f * a); 826 break; 827 case 3: 828 sum = 0.0f; 829 for (k = 0; k < dwnmix_instructions->target_channel_count * 830 channel_layout->base_channel_count; 831 k++) { 832 sum += (FLOAT32)pow( 833 10.0f, 0.1f * dwnmix_instructions->downmix_coefficient[k]); 834 } 835 b = 10.0f * (FLOAT32)log10(sum); 836 dmix_offset = 0.5f * (FLOAT32)floor(0.5f + 2.0f * b); 837 break; 838 839 default: 840 return (BITSTREAM_ERROR); 841 break; 842 } 843 for (k = 0; k < dwnmix_instructions->target_channel_count * 844 channel_layout->base_channel_count; 845 k++) { 846 dwnmix_instructions->downmix_coefficient[k] = (FLOAT32)pow( 847 10.0f, 0.05f * (dwnmix_instructions->downmix_coefficient[k] + 848 dmix_offset)); 849 } 850 } 851 } 852 return (0); 853 } 854 855 VOID impd_drc_gen_instructions_for_drc_off(ia_drc_config* drc_config) { 856 WORD32 i, k, s; 857 ia_drc_instructions_struct* str_drc_instruction_str; 858 s = -1; 859 860 k = drc_config->drc_instructions_uni_drc_count; 861 862 str_drc_instruction_str = &(drc_config->str_drc_instruction_str[k]); 863 memset(str_drc_instruction_str, 0, sizeof(ia_drc_instructions_struct)); 864 str_drc_instruction_str->drc_set_id = s; 865 s--; 866 str_drc_instruction_str->downmix_id[0] = ID_FOR_BASE_LAYOUT; 867 str_drc_instruction_str->dwnmix_id_count = 1; 868 str_drc_instruction_str->drc_apply_to_dwnmix = 0; 869 str_drc_instruction_str->depends_on_drc_set_present = 0; 870 str_drc_instruction_str->no_independent_use = 0; 871 str_drc_instruction_str->gain_element_count = 0; 872 for (i = 1; i < drc_config->dwnmix_instructions_count + 1; i++) { 873 str_drc_instruction_str = &(drc_config->str_drc_instruction_str[k + i]); 874 memset(str_drc_instruction_str, 0, sizeof(ia_drc_instructions_struct)); 875 str_drc_instruction_str->drc_set_id = s; 876 s--; 877 str_drc_instruction_str->drc_set_complexity_level = 0; 878 str_drc_instruction_str->requires_eq = 0; 879 str_drc_instruction_str->downmix_id[0] = 880 drc_config->dwnmix_instructions[i - 1].downmix_id; 881 str_drc_instruction_str->dwnmix_id_count = 1; 882 str_drc_instruction_str->drc_apply_to_dwnmix = 0; 883 str_drc_instruction_str->depends_on_drc_set_present = 0; 884 str_drc_instruction_str->no_independent_use = 0; 885 str_drc_instruction_str->gain_element_count = 0; 886 } 887 drc_config->drc_instructions_count_plus = 888 drc_config->drc_instructions_uni_drc_count + 889 drc_config->dwnmix_instructions_count + 1; 890 return; 891 } 892 893 WORD32 894 impd_parse_drc_config_ext(ia_bit_buf_struct* it_bit_buff, 895 ia_drc_params_bs_dec_struct* ia_drc_params_struct, 896 ia_drc_config* drc_config, 897 ia_drc_config_ext* str_drc_config_ext) { 898 WORD32 err = 0, i, k; 899 WORD32 bit_size_len, ext_size_bits, bit_size, other_bit; 900 901 k = 0; 902 str_drc_config_ext->drc_config_ext_type[k] = 903 impd_read_bits_buf(it_bit_buff, 4); 904 if (it_bit_buff->error) return it_bit_buff->error; 905 while (str_drc_config_ext->drc_config_ext_type[k] != UNIDRCCONFEXT_TERM) { 906 if (k >= (EXT_COUNT_MAX - 1)) return UNEXPECTED_ERROR; 907 bit_size_len = impd_read_bits_buf(it_bit_buff, 4); 908 if (it_bit_buff->error) return it_bit_buff->error; 909 ext_size_bits = bit_size_len + 4; 910 911 bit_size = impd_read_bits_buf(it_bit_buff, ext_size_bits); 912 if (it_bit_buff->error) return it_bit_buff->error; 913 str_drc_config_ext->ext_bit_size[k] = bit_size + 1; 914 915 switch (str_drc_config_ext->drc_config_ext_type[k]) { 916 case UNIDRCCONFEXT_PARAM_DRC: 917 str_drc_config_ext->parametric_drc_present = 1; 918 err = impd_parametic_drc_parse_coeff( 919 it_bit_buff, drc_config, 920 &(str_drc_config_ext->str_drc_coeff_param_drc)); 921 if (err) return (err); 922 str_drc_config_ext->parametric_drc_instructions_count = 923 impd_read_bits_buf(it_bit_buff, 4); 924 if (it_bit_buff->error) return it_bit_buff->error; 925 if (str_drc_config_ext->parametric_drc_instructions_count > 926 PARAM_DRC_INSTRUCTIONS_COUNT_MAX) 927 return (UNEXPECTED_ERROR); 928 929 for (i = 0; i < str_drc_config_ext->parametric_drc_instructions_count; 930 i++) { 931 err = impd_parse_parametric_drc_instructions( 932 it_bit_buff, str_drc_config_ext->str_drc_coeff_param_drc 933 .parametric_drc_frame_size, 934 &(str_drc_config_ext->str_parametric_drc_instructions[i])); 935 if (err) return (err); 936 } 937 break; 938 case UNIDRCCONFEXT_V1: 939 str_drc_config_ext->drc_extension_v1_present = 1; 940 err = impd_parse_drc_ext_v1(it_bit_buff, ia_drc_params_struct, 941 drc_config, str_drc_config_ext); 942 if (err) return (err); 943 break; 944 default: 945 for (i = 0; i < str_drc_config_ext->ext_bit_size[k]; i++) { 946 other_bit = impd_read_bits_buf(it_bit_buff, 1); 947 if (it_bit_buff->error) return it_bit_buff->error; 948 } 949 break; 950 } 951 k++; 952 str_drc_config_ext->drc_config_ext_type[k] = 953 impd_read_bits_buf(it_bit_buff, 4); 954 if (it_bit_buff->error) return it_bit_buff->error; 955 } 956 957 return (0); 958 } 959 960 static WORD32 impd_parse_split_drc_characteristic( 961 ia_bit_buf_struct* it_bit_buff, const WORD32 side, 962 ia_split_drc_characteristic_struct* split_drc_characteristic) { 963 // WORD32 err = 0; 964 WORD32 i, temp; 965 966 split_drc_characteristic->characteristic_format = 967 impd_read_bits_buf(it_bit_buff, 1); 968 if (it_bit_buff->error) return it_bit_buff->error; 969 if (split_drc_characteristic->characteristic_format == 0) { 970 WORD32 bsGain, bsIoRatio, bsExp; 971 bsGain = impd_read_bits_buf(it_bit_buff, 6); 972 if (it_bit_buff->error) return it_bit_buff->error; 973 if (side == LEFT_SIDE) { 974 split_drc_characteristic->gain = (FLOAT32)bsGain; 975 } else { 976 split_drc_characteristic->gain = (FLOAT32)-bsGain; 977 } 978 temp = impd_read_bits_buf(it_bit_buff, 8); 979 if (it_bit_buff->error) return it_bit_buff->error; 980 981 bsIoRatio = (temp >> 4) & 0xf; 982 bsExp = temp & 0xf; 983 split_drc_characteristic->in_out_ratio = 0.05f + 0.15f * bsIoRatio; 984 985 if (bsExp < 15) { 986 split_drc_characteristic->exp = 1.0f + 2.0f * bsExp; 987 } else { 988 split_drc_characteristic->exp = 1000.0f; 989 } 990 split_drc_characteristic->flip_sign = impd_read_bits_buf(it_bit_buff, 1); 991 if (it_bit_buff->error) return it_bit_buff->error; 992 } else { 993 WORD32 char_node_cnt, node_level_delta, node_gain; 994 char_node_cnt = impd_read_bits_buf(it_bit_buff, 2); 995 if (it_bit_buff->error) return it_bit_buff->error; 996 split_drc_characteristic->characteristic_node_count = char_node_cnt + 1; 997 split_drc_characteristic->node_level[0] = DRC_INPUT_LOUDNESS_TARGET; 998 split_drc_characteristic->node_gain[0] = 0.0f; 999 for (i = 1; i <= split_drc_characteristic->characteristic_node_count; i++) { 1000 node_level_delta = impd_read_bits_buf(it_bit_buff, 5); 1001 if (it_bit_buff->error) return it_bit_buff->error; 1002 if (side == LEFT_SIDE) { 1003 split_drc_characteristic->node_level[i] = 1004 split_drc_characteristic->node_level[i - 1] - 1005 (1.0f + node_level_delta); 1006 } else { 1007 split_drc_characteristic->node_level[i] = 1008 split_drc_characteristic->node_level[i - 1] + 1009 (1.0f + node_level_delta); 1010 } 1011 node_gain = impd_read_bits_buf(it_bit_buff, 8); 1012 if (it_bit_buff->error) return it_bit_buff->error; 1013 split_drc_characteristic->node_gain[i] = 0.5f * node_gain - 64.0f; 1014 } 1015 } 1016 return (0); 1017 } 1018 1019 WORD32 1020 impd_drc_gen_instructions_derived_data( 1021 ia_drc_config* drc_config, 1022 ia_drc_params_bs_dec_struct* ia_drc_params_struct, 1023 ia_drc_instructions_struct* str_drc_instruction_str) { 1024 WORD32 n, g; 1025 ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc = NULL; 1026 ia_drc_coeff_parametric_drc_struct* str_drc_coeff_param_drc = NULL; 1027 WORD32 gain_element_count = 0; 1028 1029 for (n = 0; n < drc_config->drc_coefficients_drc_count; n++) { 1030 if (drc_config->str_p_loc_drc_coefficients_uni_drc[n].drc_location == 1031 str_drc_instruction_str->drc_location) 1032 break; 1033 } 1034 if ((n == drc_config->drc_coefficients_drc_count) && 1035 (drc_config->drc_coefficients_drc_count > 0)) { 1036 return -1; 1037 } 1038 str_p_loc_drc_coefficients_uni_drc = 1039 &(drc_config->str_p_loc_drc_coefficients_uni_drc[n]); 1040 1041 if (drc_config->drc_config_ext_present && 1042 drc_config->str_drc_config_ext.parametric_drc_present && 1043 drc_config->str_drc_config_ext.str_drc_coeff_param_drc.drc_location == 1044 str_drc_instruction_str->drc_location) { 1045 str_drc_coeff_param_drc = 1046 &drc_config->str_drc_config_ext.str_drc_coeff_param_drc; 1047 } 1048 1049 for (g = 0; g < str_drc_instruction_str->num_drc_ch_groups; g++) { 1050 WORD32 seq = str_drc_instruction_str->gain_set_index_for_channel_group[g]; 1051 if (seq != -1 && 1052 (drc_config->drc_coefficients_drc_count == 0 || 1053 seq >= str_p_loc_drc_coefficients_uni_drc->gain_set_count)) { 1054 str_drc_instruction_str->ch_group_parametric_drc_flag[g] = 1; 1055 if (drc_config->drc_coefficients_drc_count != 0) { 1056 seq = seq - str_p_loc_drc_coefficients_uni_drc->gain_set_count; 1057 } 1058 str_drc_instruction_str->gain_set_idx_of_ch_group_parametric_drc[g] = seq; 1059 1060 if (str_drc_coeff_param_drc == NULL || 1061 seq >= str_drc_coeff_param_drc->parametric_drc_gain_set_count) { 1062 /* parametric drc gain set not available */ 1063 return (EXTERNAL_ERROR); 1064 } 1065 str_drc_instruction_str->gain_interpolation_type_for_channel_group[g] = 1; 1066 str_drc_instruction_str->time_delta_min_for_channel_group[g] = 1067 str_drc_coeff_param_drc->parametric_drc_frame_size; 1068 str_drc_instruction_str->time_alignment_for_channel_group[g] = 0; 1069 } else { 1070 str_drc_instruction_str->ch_group_parametric_drc_flag[g] = 0; 1071 } 1072 if (str_drc_instruction_str->ch_group_parametric_drc_flag[g] == 0) { 1073 if (seq >= str_p_loc_drc_coefficients_uni_drc->gain_set_count) { 1074 return -1; 1075 } 1076 str_drc_instruction_str->gain_interpolation_type_for_channel_group[g] = 1077 str_p_loc_drc_coefficients_uni_drc->gain_set_params[seq] 1078 .gain_interpolation_type; 1079 if (str_p_loc_drc_coefficients_uni_drc->gain_set_params[seq] 1080 .time_delt_min_flag) { 1081 str_drc_instruction_str->time_delta_min_for_channel_group[g] = 1082 str_p_loc_drc_coefficients_uni_drc->gain_set_params[seq] 1083 .time_delt_min_val; 1084 } else { 1085 str_drc_instruction_str->time_delta_min_for_channel_group[g] = 1086 ia_drc_params_struct->delta_tmin_default; 1087 } 1088 str_drc_instruction_str->time_alignment_for_channel_group[g] = 1089 str_p_loc_drc_coefficients_uni_drc->gain_set_params[seq] 1090 .time_alignment; 1091 } 1092 } 1093 1094 if (str_drc_instruction_str->drc_set_effect & 1095 (EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) { 1096 str_drc_instruction_str->gain_element_count = 1097 str_drc_instruction_str->num_drc_ch_groups; 1098 } else { 1099 for (g = 0; g < str_drc_instruction_str->num_drc_ch_groups; g++) { 1100 if (str_drc_instruction_str->ch_group_parametric_drc_flag[g] == 1) { 1101 gain_element_count++; 1102 str_drc_instruction_str->band_count_of_ch_group[g] = 1; 1103 } else { 1104 WORD32 seq, band_count; 1105 seq = str_drc_instruction_str->gain_set_index_for_channel_group[g]; 1106 band_count = 1107 str_p_loc_drc_coefficients_uni_drc->gain_set_params[seq].band_count; 1108 str_drc_instruction_str->band_count_of_ch_group[g] = band_count; 1109 gain_element_count += band_count; 1110 } 1111 } 1112 str_drc_instruction_str->gain_element_count = gain_element_count; 1113 } 1114 1115 return (0); 1116 } 1117 1118 WORD32 1119 impd_parse_drc_config(ia_bit_buf_struct* it_bit_buff, 1120 ia_drc_params_bs_dec_struct* ia_drc_params_struct, 1121 ia_drc_config* drc_config) { 1122 WORD32 i, err = 0, temp; 1123 WORD32 version = 0; 1124 1125 drc_config->sample_rate_present = impd_read_bits_buf(it_bit_buff, 1); 1126 if (it_bit_buff->error) return it_bit_buff->error; 1127 1128 if (drc_config->sample_rate_present == 1) { 1129 WORD32 bssample_rate; 1130 bssample_rate = impd_read_bits_buf(it_bit_buff, 18); 1131 if (it_bit_buff->error) return it_bit_buff->error; 1132 drc_config->sampling_rate = bssample_rate + 1000; 1133 } 1134 1135 temp = impd_read_bits_buf(it_bit_buff, 8); 1136 if (it_bit_buff->error) return it_bit_buff->error; 1137 1138 drc_config->dwnmix_instructions_count = (temp >> 1) & 0x7f; 1139 if (drc_config->dwnmix_instructions_count > DOWNMIX_INSTRUCTION_COUNT_MAX) 1140 return (UNEXPECTED_ERROR); 1141 1142 drc_config->drc_description_basic_present = temp & 1; 1143 1144 if (drc_config->drc_description_basic_present == 1) { 1145 temp = impd_read_bits_buf(it_bit_buff, 7); 1146 if (it_bit_buff->error) return it_bit_buff->error; 1147 1148 drc_config->drc_coefficients_basic_count = (temp >> 4) & 7; 1149 drc_config->drc_instructions_basic_count = temp & 0xf; 1150 1151 } else { 1152 drc_config->drc_coefficients_basic_count = 0; 1153 drc_config->drc_instructions_basic_count = 0; 1154 } 1155 1156 temp = impd_read_bits_buf(it_bit_buff, 9); 1157 if (it_bit_buff->error) return it_bit_buff->error; 1158 1159 drc_config->drc_coefficients_drc_count = (temp >> 6) & 7; 1160 drc_config->drc_instructions_uni_drc_count = temp & 0x3f; 1161 1162 if (drc_config->drc_instructions_uni_drc_count > DRC_INSTRUCTIONS_COUNT_MAX) 1163 return (UNEXPECTED_ERROR); 1164 1165 err = impd_parse_ch_layout(it_bit_buff, ia_drc_params_struct, 1166 &drc_config->channel_layout); 1167 if (err) return (err); 1168 1169 for (i = 0; i < drc_config->dwnmix_instructions_count; i++) { 1170 err = impd_parse_dwnmix_instructions( 1171 it_bit_buff, version, ia_drc_params_struct, &drc_config->channel_layout, 1172 &(drc_config->dwnmix_instructions[i])); 1173 if (err) return (err); 1174 } 1175 for (i = 0; i < drc_config->drc_coefficients_basic_count; i++) { 1176 temp = impd_read_bits_buf(it_bit_buff, 11); 1177 if (it_bit_buff->error) return it_bit_buff->error; 1178 1179 drc_config->str_drc_coefficients_basic[i].drc_location = (temp >> 7) & 0xf; 1180 drc_config->str_drc_coefficients_basic[i].drc_characteristic = temp & 0x3f; 1181 } 1182 for (i = 0; i < drc_config->drc_instructions_basic_count; i++) { 1183 err = impd_drc_parse_instructions_basic( 1184 it_bit_buff, &(drc_config->str_drc_instructions_basic[i])); 1185 if (err) return (err); 1186 } 1187 for (i = 0; i < drc_config->drc_coefficients_drc_count; i++) { 1188 err = impd_drc_parse_coeff( 1189 it_bit_buff, version, ia_drc_params_struct, 1190 &(drc_config->str_p_loc_drc_coefficients_uni_drc[i])); 1191 if (err) return (err); 1192 } 1193 for (i = 0; i < drc_config->drc_instructions_uni_drc_count; i++) { 1194 err = impd_parse_drc_instructions_uni_drc( 1195 it_bit_buff, version, drc_config, 1196 &(drc_config->str_drc_instruction_str[i])); 1197 if (err) return (err); 1198 } 1199 1200 drc_config->drc_config_ext_present = impd_read_bits_buf(it_bit_buff, 1); 1201 if (it_bit_buff->error) return it_bit_buff->error; 1202 1203 if (drc_config->drc_config_ext_present == 1) { 1204 err = 1205 impd_parse_drc_config_ext(it_bit_buff, ia_drc_params_struct, drc_config, 1206 &(drc_config->str_drc_config_ext)); 1207 if (err) return (err); 1208 } 1209 1210 if (drc_config->str_drc_config_ext.parametric_drc_present) { 1211 err = impd_parametric_drc_gen_virtual_gain_sets(drc_config); 1212 if (err) return (err); 1213 } 1214 1215 for (i = 0; i < drc_config->drc_instructions_uni_drc_count; i++) { 1216 err = impd_drc_gen_instructions_derived_data( 1217 drc_config, ia_drc_params_struct, 1218 &(drc_config->str_drc_instruction_str[i])); 1219 if (err) return (err); 1220 } 1221 1222 impd_drc_gen_instructions_for_drc_off(drc_config); 1223 return (0); 1224 } 1225 1226 WORD32 1227 impd_dec_method_value(ia_bit_buf_struct* it_bit_buff, WORD32 method_def, 1228 FLOAT32* method_val) { 1229 // WORD32 err = 0; 1230 WORD32 tmp; 1231 FLOAT32 val; 1232 switch (method_def) { 1233 case METHOD_DEFINITION_UNKNOWN_OTHER: 1234 case METHOD_DEFINITION_PROGRAM_LOUDNESS: 1235 case METHOD_DEFINITION_ANCHOR_LOUDNESS: 1236 case METHOD_DEFINITION_MAX_OF_LOUDNESS_RANGE: 1237 case METHOD_DEFINITION_MOMENTARY_LOUDNESS_MAX: 1238 case METHOD_DEFINITION_SHORT_TERM_LOUDNESS_MAX: 1239 tmp = impd_read_bits_buf(it_bit_buff, 8); 1240 if (it_bit_buff->error) return it_bit_buff->error; 1241 val = -57.75f + tmp * 0.25f; 1242 break; 1243 case METHOD_DEFINITION_LOUDNESS_RANGE: 1244 tmp = impd_read_bits_buf(it_bit_buff, 8); 1245 if (it_bit_buff->error) return it_bit_buff->error; 1246 if (tmp == 0) 1247 val = 0.0f; 1248 else if (tmp <= 128) 1249 val = tmp * 0.25f; 1250 else if (tmp <= 204) 1251 val = 0.5f * tmp - 32.0f; 1252 else 1253 val = tmp - 134.0f; 1254 break; 1255 case METHOD_DEFINITION_MIXING_LEVEL: 1256 tmp = impd_read_bits_buf(it_bit_buff, 5); 1257 if (it_bit_buff->error) return it_bit_buff->error; 1258 val = tmp + 80.0f; 1259 break; 1260 case METHOD_DEFINITION_ROOM_TYPE: 1261 tmp = impd_read_bits_buf(it_bit_buff, 2); 1262 if (it_bit_buff->error) return it_bit_buff->error; 1263 val = (FLOAT32)tmp; 1264 break; 1265 case METHOD_DEFINITION_SHORT_TERM_LOUDNESS: 1266 tmp = impd_read_bits_buf(it_bit_buff, 8); 1267 if (it_bit_buff->error) return it_bit_buff->error; 1268 val = -116.f + tmp * 0.5f; 1269 break; 1270 default: 1271 return -1; 1272 break; 1273 } 1274 *method_val = val; 1275 return 0; 1276 } 1277 1278 WORD32 1279 impd_parse_loudness_info_set( 1280 ia_bit_buf_struct* it_bit_buff, 1281 ia_drc_loudness_info_set_struct* loudness_info_set) { 1282 WORD32 err = 0, i, version = 0, offset, temp; 1283 WORD32 loudness_info_album_count, loudness_info_count; 1284 1285 temp = impd_read_bits_buf(it_bit_buff, 12); 1286 if (it_bit_buff->error) return it_bit_buff->error; 1287 1288 loudness_info_album_count = (temp >> 6) & 0x3f; 1289 loudness_info_count = temp & 0x3f; 1290 1291 offset = loudness_info_set->loudness_info_album_count; 1292 loudness_info_set->loudness_info_album_count += loudness_info_album_count; 1293 if ((offset + loudness_info_set->loudness_info_album_count) > 1294 LOUDNESS_INFO_COUNT_MAX) 1295 return (UNEXPECTED_ERROR); 1296 for (i = 0; i < loudness_info_set->loudness_info_album_count; i++) { 1297 err = impd_parse_loudness_info( 1298 it_bit_buff, version, 1299 &(loudness_info_set->str_loudness_info_album[i + offset])); 1300 if (err) return (err); 1301 } 1302 1303 offset = loudness_info_set->loudness_info_count; 1304 loudness_info_set->loudness_info_count += loudness_info_count; 1305 if ((offset + loudness_info_set->loudness_info_count) > 1306 LOUDNESS_INFO_COUNT_MAX) 1307 return (UNEXPECTED_ERROR); 1308 for (i = 0; i < loudness_info_set->loudness_info_count; i++) { 1309 err = impd_parse_loudness_info( 1310 it_bit_buff, version, &(loudness_info_set->loudness_info[i + offset])); 1311 if (err) return (err); 1312 } 1313 1314 loudness_info_set->loudness_info_set_ext_present = 1315 impd_read_bits_buf(it_bit_buff, 1); 1316 if (it_bit_buff->error) return it_bit_buff->error; 1317 1318 if (loudness_info_set->loudness_info_set_ext_present == 1) { 1319 err = impd_parse_loudness_info_set_ext(it_bit_buff, loudness_info_set); 1320 if (err) return (err); 1321 } 1322 1323 return (0); 1324 } 1325 1326 WORD32 1327 impd_parse_gain_set_params_characteristics(ia_bit_buf_struct* it_bit_buff, 1328 WORD32 version, 1329 ia_gain_params_struct* gain_params) { 1330 // WORD32 err = 0; 1331 WORD32 temp; 1332 if (version == 0) { 1333 gain_params->drc_characteristic = impd_read_bits_buf(it_bit_buff, 7); 1334 if (it_bit_buff->error) return it_bit_buff->error; 1335 if (gain_params->drc_characteristic > 0) { 1336 gain_params->drc_characteristic_present = 1; 1337 gain_params->drc_characteristic_format_is_cicp = 1; 1338 } else { 1339 gain_params->drc_characteristic_present = 0; 1340 } 1341 } else { 1342 gain_params->drc_characteristic_present = 1343 impd_read_bits_buf(it_bit_buff, 1); 1344 if (it_bit_buff->error) return it_bit_buff->error; 1345 if (gain_params->drc_characteristic_present) { 1346 gain_params->drc_characteristic_format_is_cicp = 1347 impd_read_bits_buf(it_bit_buff, 1); 1348 if (it_bit_buff->error) return it_bit_buff->error; 1349 if (gain_params->drc_characteristic_format_is_cicp) { 1350 gain_params->drc_characteristic = impd_read_bits_buf(it_bit_buff, 7); 1351 if (it_bit_buff->error) return it_bit_buff->error; 1352 } else { 1353 temp = impd_read_bits_buf(it_bit_buff, 8); 1354 if (it_bit_buff->error) return it_bit_buff->error; 1355 1356 gain_params->drc_characteristic_left_index = (temp >> 4) & 0xf; 1357 gain_params->drc_characteristic_right_index = temp & 0xf; 1358 } 1359 } 1360 } 1361 return (0); 1362 } 1363 1364 WORD32 1365 impd_parse_loudness_measure(ia_bit_buf_struct* it_bit_buff, 1366 ia_loudness_measure_struct* loudness_measure) { 1367 WORD32 err = 0, temp; 1368 1369 loudness_measure->method_def = impd_read_bits_buf(it_bit_buff, 4); 1370 if (it_bit_buff->error) return it_bit_buff->error; 1371 1372 err = impd_dec_method_value(it_bit_buff, loudness_measure->method_def, 1373 &(loudness_measure->method_val)); 1374 if (err) return err; 1375 1376 temp = impd_read_bits_buf(it_bit_buff, 6); 1377 if (it_bit_buff->error) return it_bit_buff->error; 1378 1379 loudness_measure->measurement_system = (temp >> 2) & 0xf; 1380 if (loudness_measure->measurement_system > MEASUREMENT_SYSTEM_RESERVED_E) 1381 return (UNEXPECTED_ERROR); 1382 /* Parsed but unused */ 1383 loudness_measure->reliability = temp & 3; 1384 1385 return (0); 1386 } 1387 1388 WORD32 1389 impd_dec_gain_modifiers(ia_bit_buf_struct* it_bit_buff, WORD32 version, 1390 WORD32 band_count, 1391 ia_gain_modifiers_struct* pstr_gain_modifiers) { 1392 // WORD32 err = 0; 1393 WORD32 sign, temp; 1394 1395 if (version > 0) { 1396 WORD32 b; 1397 for (b = 0; b < band_count; b++) { 1398 pstr_gain_modifiers->target_characteristic_left_present[b] = 1399 impd_read_bits_buf(it_bit_buff, 1); 1400 if (it_bit_buff->error) return it_bit_buff->error; 1401 if (pstr_gain_modifiers->target_characteristic_left_present[b]) { 1402 pstr_gain_modifiers->target_characteristic_left_index[b] = 1403 impd_read_bits_buf(it_bit_buff, 4); 1404 if (it_bit_buff->error) return it_bit_buff->error; 1405 } 1406 pstr_gain_modifiers->target_characteristic_right_present[b] = 1407 impd_read_bits_buf(it_bit_buff, 1); 1408 if (it_bit_buff->error) return it_bit_buff->error; 1409 if (pstr_gain_modifiers->target_characteristic_right_present[b]) { 1410 pstr_gain_modifiers->target_characteristic_right_index[b] = 1411 impd_read_bits_buf(it_bit_buff, 4); 1412 if (it_bit_buff->error) return it_bit_buff->error; 1413 } 1414 pstr_gain_modifiers->gain_scaling_flag[b] = 1415 impd_read_bits_buf(it_bit_buff, 1); 1416 if (it_bit_buff->error) return it_bit_buff->error; 1417 if (pstr_gain_modifiers->gain_scaling_flag[b]) { 1418 temp = impd_read_bits_buf(it_bit_buff, 8); 1419 if (it_bit_buff->error) return it_bit_buff->error; 1420 1421 pstr_gain_modifiers->attn_scaling[b] = ((temp >> 4) & 0xf) * 0.125f; 1422 pstr_gain_modifiers->ampl_scaling[b] = (temp & 0xf) * 0.125f; 1423 } 1424 1425 pstr_gain_modifiers->gain_offset_flag[b] = 1426 impd_read_bits_buf(it_bit_buff, 1); 1427 if (it_bit_buff->error) return it_bit_buff->error; 1428 if (pstr_gain_modifiers->gain_offset_flag[b]) { 1429 FLOAT32 gain_offset; 1430 temp = impd_read_bits_buf(it_bit_buff, 6); 1431 if (it_bit_buff->error) return it_bit_buff->error; 1432 1433 sign = ((temp >> 5) & 1); 1434 gain_offset = (1 + (temp & 0x1f)) * 0.25f; 1435 1436 if (sign) { 1437 gain_offset = -gain_offset; 1438 } 1439 pstr_gain_modifiers->gain_offset[b] = gain_offset; 1440 } 1441 } 1442 if (band_count == 1) { 1443 pstr_gain_modifiers->shape_filter_flag = 1444 impd_read_bits_buf(it_bit_buff, 1); 1445 if (it_bit_buff->error) return it_bit_buff->error; 1446 if (pstr_gain_modifiers->shape_filter_flag) { 1447 pstr_gain_modifiers->shape_filter_idx = 1448 impd_read_bits_buf(it_bit_buff, 4); 1449 if (it_bit_buff->error) return it_bit_buff->error; 1450 } 1451 } 1452 } else if (version == 0) { 1453 WORD32 b, gain_scaling_flag, gain_offset_flag; 1454 FLOAT32 attn_scaling = 1.0f, ampl_scaling = 1.0f, gain_offset = 0.0f; 1455 1456 gain_scaling_flag = impd_read_bits_buf(it_bit_buff, 1); 1457 if (it_bit_buff->error) return it_bit_buff->error; 1458 if (gain_scaling_flag) { 1459 temp = impd_read_bits_buf(it_bit_buff, 8); 1460 if (it_bit_buff->error) return it_bit_buff->error; 1461 1462 attn_scaling = ((temp >> 4) & 0xf) * 0.125f; 1463 ampl_scaling = (temp & 0xf) * 0.125f; 1464 } 1465 1466 gain_offset_flag = impd_read_bits_buf(it_bit_buff, 1); 1467 if (it_bit_buff->error) return it_bit_buff->error; 1468 if (gain_offset_flag) { 1469 temp = impd_read_bits_buf(it_bit_buff, 6); 1470 if (it_bit_buff->error) return it_bit_buff->error; 1471 1472 sign = ((temp >> 5) & 1); 1473 gain_offset = (1 + (temp & 0x1f)) * 0.25f; 1474 1475 if (sign) { 1476 gain_offset = -gain_offset; 1477 } 1478 } 1479 for (b = 0; b < band_count; b++) { 1480 pstr_gain_modifiers->target_characteristic_left_present[b] = 0; 1481 pstr_gain_modifiers->target_characteristic_right_present[b] = 0; 1482 pstr_gain_modifiers->gain_scaling_flag[b] = gain_scaling_flag; 1483 pstr_gain_modifiers->attn_scaling[b] = attn_scaling; 1484 pstr_gain_modifiers->ampl_scaling[b] = ampl_scaling; 1485 pstr_gain_modifiers->gain_offset_flag[b] = gain_offset_flag; 1486 pstr_gain_modifiers->gain_offset[b] = gain_offset; 1487 } 1488 pstr_gain_modifiers->shape_filter_flag = 0; 1489 } 1490 return (0); 1491 } 1492 1493 WORD32 1494 impd_parse_gain_set_params(ia_bit_buf_struct* it_bit_buff, WORD32 version, 1495 WORD32* gain_seq_idx, 1496 ia_gain_set_params_struct* gain_set_params) { 1497 WORD32 err = 0, i, temp; 1498 1499 temp = impd_read_bits_buf(it_bit_buff, 6); 1500 if (it_bit_buff->error) return it_bit_buff->error; 1501 1502 gain_set_params->gain_coding_profile = (temp >> 4) & 3; 1503 gain_set_params->gain_interpolation_type = (temp >> 3) & 1; 1504 gain_set_params->full_frame = (temp >> 2) & 1; 1505 gain_set_params->time_alignment = (temp >> 1) & 1; 1506 gain_set_params->time_delt_min_flag = temp & 1; 1507 1508 if (gain_set_params->time_delt_min_flag) { 1509 WORD32 time_delta_min; 1510 time_delta_min = impd_read_bits_buf(it_bit_buff, 11); 1511 if (it_bit_buff->error) return it_bit_buff->error; 1512 gain_set_params->time_delt_min_val = time_delta_min + 1; 1513 } 1514 1515 if (gain_set_params->gain_coding_profile == GAIN_CODING_PROFILE_CONSTANT) { 1516 gain_set_params->band_count = 1; 1517 *gain_seq_idx = (*gain_seq_idx) + 1; 1518 } else { 1519 gain_set_params->band_count = impd_read_bits_buf(it_bit_buff, 4); 1520 if (it_bit_buff->error) return it_bit_buff->error; 1521 1522 if (gain_set_params->band_count > BAND_COUNT_MAX) return (UNEXPECTED_ERROR); 1523 1524 if (gain_set_params->band_count > 1) { 1525 gain_set_params->drc_band_type = impd_read_bits_buf(it_bit_buff, 1); 1526 if (it_bit_buff->error) return it_bit_buff->error; 1527 } 1528 for (i = 0; i < gain_set_params->band_count; i++) { 1529 if (version == 0) { 1530 *gain_seq_idx = (*gain_seq_idx) + 1; 1531 } else { 1532 WORD32 indexPresent; 1533 indexPresent = impd_read_bits_buf(it_bit_buff, 1); 1534 if (it_bit_buff->error) return it_bit_buff->error; 1535 if (indexPresent) { 1536 WORD32 bsIndex; 1537 bsIndex = impd_read_bits_buf(it_bit_buff, 6); 1538 if (it_bit_buff->error) return it_bit_buff->error; 1539 *gain_seq_idx = bsIndex; 1540 } else { 1541 *gain_seq_idx = (*gain_seq_idx) + 1; 1542 } 1543 } 1544 1545 if (*gain_seq_idx >= SEQUENCE_COUNT_MAX) return UNEXPECTED_ERROR; 1546 1547 gain_set_params->gain_params[i].gain_seq_idx = *gain_seq_idx; 1548 err = impd_parse_gain_set_params_characteristics( 1549 it_bit_buff, version, &(gain_set_params->gain_params[i])); 1550 if (err) return (err); 1551 } 1552 if (gain_set_params->drc_band_type) { 1553 for (i = 1; i < gain_set_params->band_count; i++) { 1554 gain_set_params->gain_params[i].crossover_freq_idx = 1555 impd_read_bits_buf(it_bit_buff, 4); 1556 if (it_bit_buff->error) return it_bit_buff->error; 1557 } 1558 } else { 1559 for (i = 1; i < gain_set_params->band_count; i++) { 1560 gain_set_params->gain_params[i].start_subband_index = 1561 impd_read_bits_buf(it_bit_buff, 10); 1562 if (it_bit_buff->error) return it_bit_buff->error; 1563 } 1564 } 1565 } 1566 1567 return (0); 1568 } 1569 1570 WORD32 1571 impd_sel_drc_coeff( 1572 ia_drc_config* drc_config, WORD32 location, 1573 ia_uni_drc_coeffs_struct** str_p_loc_drc_coefficients_uni_drc) { 1574 WORD32 n; 1575 WORD32 c1 = -1; 1576 WORD32 c0 = -1; 1577 for (n = 0; n < drc_config->drc_coefficients_drc_count; n++) { 1578 if (drc_config->str_p_loc_drc_coefficients_uni_drc[n].drc_location == 1579 location) { 1580 if (drc_config->str_p_loc_drc_coefficients_uni_drc[n].version == 0) { 1581 c0 = n; 1582 } else { 1583 c1 = n; 1584 } 1585 } 1586 } 1587 if (c1 >= 0) { 1588 *str_p_loc_drc_coefficients_uni_drc = 1589 &(drc_config->str_p_loc_drc_coefficients_uni_drc[c1]); 1590 } else if (c0 >= 0) { 1591 *str_p_loc_drc_coefficients_uni_drc = 1592 &(drc_config->str_p_loc_drc_coefficients_uni_drc[c0]); 1593 } else { 1594 *str_p_loc_drc_coefficients_uni_drc = NULL; 1595 } 1596 return (0); 1597 } 1598 1599 WORD32 1600 impd_parse_loudness_info_set_ext( 1601 ia_bit_buf_struct* it_bit_buff, 1602 ia_drc_loudness_info_set_struct* loudness_info_set) { 1603 WORD32 err = 0, i, k; 1604 WORD32 bit_size_len, ext_size_bits, bit_size, other_bit; 1605 1606 k = 0; 1607 loudness_info_set->str_loudness_info_set_ext.loudness_info_set_ext_type[k] = 1608 impd_read_bits_buf(it_bit_buff, 4); 1609 if (it_bit_buff->error) return it_bit_buff->error; 1610 while (loudness_info_set->str_loudness_info_set_ext 1611 .loudness_info_set_ext_type[k] != UNIDRCLOUDEXT_TERM) { 1612 bit_size_len = impd_read_bits_buf(it_bit_buff, 4); 1613 if (it_bit_buff->error) return it_bit_buff->error; 1614 ext_size_bits = bit_size_len + 4; 1615 1616 bit_size = impd_read_bits_buf(it_bit_buff, ext_size_bits); 1617 if (it_bit_buff->error) return it_bit_buff->error; 1618 if (k >= (EXT_COUNT_MAX - 1)) return UNEXPECTED_ERROR; 1619 loudness_info_set->str_loudness_info_set_ext.ext_bit_size[k] = bit_size + 1; 1620 1621 switch (loudness_info_set->str_loudness_info_set_ext 1622 .loudness_info_set_ext_type[k]) { 1623 case UNIDRCLOUDEXT_EQ: 1624 err = impd_parse_loud_info_set_ext_eq(it_bit_buff, loudness_info_set); 1625 if (err) return (err); 1626 break; 1627 default: 1628 for (i = 0; 1629 i < loudness_info_set->str_loudness_info_set_ext.ext_bit_size[k]; 1630 i++) { 1631 other_bit = impd_read_bits_buf(it_bit_buff, 1); 1632 if (it_bit_buff->error) return it_bit_buff->error; 1633 } 1634 break; 1635 } 1636 k++; 1637 loudness_info_set->str_loudness_info_set_ext.loudness_info_set_ext_type[k] = 1638 impd_read_bits_buf(it_bit_buff, 4); 1639 if (it_bit_buff->error) return it_bit_buff->error; 1640 } 1641 1642 return (0); 1643 } 1644 1645 WORD32 1646 impd_drc_parse_coeff( 1647 ia_bit_buf_struct* it_bit_buff, WORD32 version, 1648 ia_drc_params_bs_dec_struct* ia_drc_params_struct, 1649 ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc) { 1650 WORD32 err = 0, i, drc_frame_size, temp; 1651 WORD32 gain_seq_idx = -1; 1652 1653 str_p_loc_drc_coefficients_uni_drc->version = version; 1654 if (version == 0) { 1655 WORD32 gain_sequence_count = 0; 1656 temp = impd_read_bits_buf(it_bit_buff, 5); 1657 if (it_bit_buff->error) return it_bit_buff->error; 1658 1659 str_p_loc_drc_coefficients_uni_drc->drc_location = (temp >> 1) & 0xf; 1660 str_p_loc_drc_coefficients_uni_drc->drc_frame_size_present = temp & 1; 1661 1662 if (str_p_loc_drc_coefficients_uni_drc->drc_frame_size_present == 1) { 1663 drc_frame_size = impd_read_bits_buf(it_bit_buff, 15); 1664 if (it_bit_buff->error) return it_bit_buff->error; 1665 str_p_loc_drc_coefficients_uni_drc->drc_frame_size = drc_frame_size + 1; 1666 } 1667 1668 str_p_loc_drc_coefficients_uni_drc->drc_characteristic_left_present = 0; 1669 str_p_loc_drc_coefficients_uni_drc->drc_characteristic_right_present = 0; 1670 str_p_loc_drc_coefficients_uni_drc->shape_filters_present = 0; 1671 str_p_loc_drc_coefficients_uni_drc->gain_set_count = 1672 impd_read_bits_buf(it_bit_buff, 6); 1673 if (it_bit_buff->error) return it_bit_buff->error; 1674 1675 if (str_p_loc_drc_coefficients_uni_drc->gain_set_count > GAIN_SET_COUNT_MAX) 1676 return (UNEXPECTED_ERROR); 1677 1678 str_p_loc_drc_coefficients_uni_drc->gain_set_count_plus = 1679 str_p_loc_drc_coefficients_uni_drc->gain_set_count; 1680 for (i = 0; i < str_p_loc_drc_coefficients_uni_drc->gain_set_count; i++) { 1681 err = impd_parse_gain_set_params( 1682 it_bit_buff, version, &gain_seq_idx, 1683 &(str_p_loc_drc_coefficients_uni_drc->gain_set_params[i])); 1684 if (err) return (err); 1685 1686 if (str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 1687 .time_delt_min_flag) { 1688 if (str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 1689 .time_delt_min_val > ia_drc_params_struct->drc_frame_size) { 1690 /* drc time interval too big */ 1691 return (PARAM_ERROR); 1692 } 1693 str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 1694 .num_gain_max_values = 1695 ia_drc_params_struct->drc_frame_size / 1696 str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 1697 .time_delt_min_val; 1698 err = impd_init_tbls( 1699 str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 1700 .num_gain_max_values, 1701 &(str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 1702 .str_tables)); 1703 if (err) return (err); 1704 } 1705 gain_sequence_count += 1706 str_p_loc_drc_coefficients_uni_drc->gain_set_params[i].band_count; 1707 } 1708 str_p_loc_drc_coefficients_uni_drc->gain_sequence_count = 1709 gain_sequence_count; 1710 } else { 1711 ia_shape_filter_block_params_struct* pstr_shape_filter_block_params; 1712 for (i = 0; i < SEQUENCE_COUNT_MAX; i++) { 1713 str_p_loc_drc_coefficients_uni_drc 1714 ->gain_set_params_index_for_gain_sequence[i] = -1; 1715 } 1716 1717 temp = impd_read_bits_buf(it_bit_buff, 5); 1718 if (it_bit_buff->error) return it_bit_buff->error; 1719 1720 str_p_loc_drc_coefficients_uni_drc->drc_location = (temp >> 1) & 0xf; 1721 str_p_loc_drc_coefficients_uni_drc->drc_frame_size_present = temp & 1; 1722 1723 if (str_p_loc_drc_coefficients_uni_drc->drc_frame_size_present == 1) { 1724 drc_frame_size = impd_read_bits_buf(it_bit_buff, 15); 1725 if (it_bit_buff->error) return it_bit_buff->error; 1726 str_p_loc_drc_coefficients_uni_drc->drc_frame_size = drc_frame_size + 1; 1727 } 1728 str_p_loc_drc_coefficients_uni_drc->drc_characteristic_left_present = 1729 impd_read_bits_buf(it_bit_buff, 1); 1730 if (it_bit_buff->error) return it_bit_buff->error; 1731 if (str_p_loc_drc_coefficients_uni_drc->drc_characteristic_left_present == 1732 1) { 1733 str_p_loc_drc_coefficients_uni_drc->characteristic_left_count = 1734 impd_read_bits_buf(it_bit_buff, 4); 1735 if (it_bit_buff->error) return it_bit_buff->error; 1736 1737 if (str_p_loc_drc_coefficients_uni_drc->characteristic_left_count > 1738 SPLIT_CHARACTERISTIC_COUNT_MAX) 1739 return (UNEXPECTED_ERROR); 1740 1741 for (i = 1; 1742 i <= str_p_loc_drc_coefficients_uni_drc->characteristic_left_count; 1743 i++) { 1744 err = impd_parse_split_drc_characteristic( 1745 it_bit_buff, LEFT_SIDE, &(str_p_loc_drc_coefficients_uni_drc 1746 ->str_split_characteristic_left[i])); 1747 if (err) return (err); 1748 } 1749 } 1750 str_p_loc_drc_coefficients_uni_drc->drc_characteristic_right_present = 1751 impd_read_bits_buf(it_bit_buff, 1); 1752 if (it_bit_buff->error) return it_bit_buff->error; 1753 if (str_p_loc_drc_coefficients_uni_drc->drc_characteristic_right_present == 1754 1) { 1755 str_p_loc_drc_coefficients_uni_drc->characteristic_right_count = 1756 impd_read_bits_buf(it_bit_buff, 4); 1757 if (it_bit_buff->error) return it_bit_buff->error; 1758 1759 if (str_p_loc_drc_coefficients_uni_drc->characteristic_right_count > 1760 SPLIT_CHARACTERISTIC_COUNT_MAX) 1761 return (UNEXPECTED_ERROR); 1762 for (i = 1; 1763 i <= str_p_loc_drc_coefficients_uni_drc->characteristic_right_count; 1764 i++) { 1765 err = impd_parse_split_drc_characteristic( 1766 it_bit_buff, RIGHT_SIDE, 1767 &(str_p_loc_drc_coefficients_uni_drc 1768 ->str_split_characteristic_right[i])); 1769 if (err) return (err); 1770 } 1771 } 1772 str_p_loc_drc_coefficients_uni_drc->shape_filters_present = 1773 impd_read_bits_buf(it_bit_buff, 1); 1774 if (it_bit_buff->error) return it_bit_buff->error; 1775 if (str_p_loc_drc_coefficients_uni_drc->shape_filters_present == 1) { 1776 str_p_loc_drc_coefficients_uni_drc->shape_num_filter = 1777 impd_read_bits_buf(it_bit_buff, 4); 1778 if (it_bit_buff->error) return it_bit_buff->error; 1779 if (str_p_loc_drc_coefficients_uni_drc->shape_num_filter > 1780 SHAPE_FILTER_COUNT_MAX) 1781 return (UNEXPECTED_ERROR); 1782 for (i = 1; i <= str_p_loc_drc_coefficients_uni_drc->shape_num_filter; 1783 i++) { 1784 pstr_shape_filter_block_params = 1785 &(str_p_loc_drc_coefficients_uni_drc 1786 ->str_shape_filter_block_params[i]); 1787 pstr_shape_filter_block_params->lf_cut_filter_present = 1788 impd_read_bits_buf(it_bit_buff, 1); 1789 if (it_bit_buff->error) return it_bit_buff->error; 1790 1791 if (pstr_shape_filter_block_params->lf_cut_filter_present == 1) { 1792 temp = impd_read_bits_buf(it_bit_buff, 5); 1793 if (it_bit_buff->error) return it_bit_buff->error; 1794 1795 pstr_shape_filter_block_params->str_lf_cut_params.corner_freq_index = 1796 (temp >> 2) & 7; 1797 pstr_shape_filter_block_params->str_lf_cut_params 1798 .filter_strength_index = temp & 3; 1799 } 1800 pstr_shape_filter_block_params->lf_boost_filter_present = 1801 impd_read_bits_buf(it_bit_buff, 1); 1802 if (it_bit_buff->error) return it_bit_buff->error; 1803 if (pstr_shape_filter_block_params->lf_boost_filter_present == 1) { 1804 temp = impd_read_bits_buf(it_bit_buff, 5); 1805 if (it_bit_buff->error) return it_bit_buff->error; 1806 1807 pstr_shape_filter_block_params->str_lf_boost_params 1808 .corner_freq_index = (temp >> 2) & 7; 1809 pstr_shape_filter_block_params->str_lf_boost_params 1810 .filter_strength_index = temp & 3; 1811 } 1812 pstr_shape_filter_block_params->hf_cut_filter_present = 1813 impd_read_bits_buf(it_bit_buff, 1); 1814 if (it_bit_buff->error) return it_bit_buff->error; 1815 if (pstr_shape_filter_block_params->hf_cut_filter_present == 1) { 1816 temp = impd_read_bits_buf(it_bit_buff, 5); 1817 if (it_bit_buff->error) return it_bit_buff->error; 1818 1819 pstr_shape_filter_block_params->str_hfCutParams.corner_freq_index = 1820 (temp >> 2) & 7; 1821 pstr_shape_filter_block_params->str_hfCutParams 1822 .filter_strength_index = temp & 3; 1823 } 1824 pstr_shape_filter_block_params->hf_boost_filter_present = 1825 impd_read_bits_buf(it_bit_buff, 1); 1826 if (it_bit_buff->error) return it_bit_buff->error; 1827 if (pstr_shape_filter_block_params->hf_boost_filter_present == 1) { 1828 temp = impd_read_bits_buf(it_bit_buff, 5); 1829 if (it_bit_buff->error) return it_bit_buff->error; 1830 1831 pstr_shape_filter_block_params->str_hf_boost_params 1832 .corner_freq_index = (temp >> 2) & 7; 1833 pstr_shape_filter_block_params->str_hf_boost_params 1834 .filter_strength_index = temp & 3; 1835 } 1836 } 1837 } 1838 1839 temp = impd_read_bits_buf(it_bit_buff, 12); 1840 if (it_bit_buff->error) return it_bit_buff->error; 1841 1842 str_p_loc_drc_coefficients_uni_drc->gain_sequence_count = 1843 (temp >> 6) & 0x3f; 1844 1845 if (str_p_loc_drc_coefficients_uni_drc->gain_sequence_count > 1846 SEQUENCE_COUNT_MAX) 1847 return UNEXPECTED_ERROR; 1848 1849 str_p_loc_drc_coefficients_uni_drc->gain_set_count = temp & 0x3f; 1850 1851 if (str_p_loc_drc_coefficients_uni_drc->gain_set_count > GAIN_SET_COUNT_MAX) 1852 return (UNEXPECTED_ERROR); 1853 1854 str_p_loc_drc_coefficients_uni_drc->gain_set_count_plus = 1855 str_p_loc_drc_coefficients_uni_drc->gain_set_count; 1856 for (i = 0; i < str_p_loc_drc_coefficients_uni_drc->gain_set_count; i++) { 1857 err = impd_parse_gain_set_params( 1858 it_bit_buff, version, &gain_seq_idx, 1859 &(str_p_loc_drc_coefficients_uni_drc->gain_set_params[i])); 1860 if (err) return (err); 1861 1862 if (str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 1863 .time_delt_min_flag) { 1864 if (str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 1865 .time_delt_min_val > ia_drc_params_struct->drc_frame_size) { 1866 /* drc time interval too big */ 1867 return (PARAM_ERROR); 1868 } 1869 str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 1870 .num_gain_max_values = 1871 ia_drc_params_struct->drc_frame_size / 1872 str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 1873 .time_delt_min_val; 1874 err = impd_init_tbls( 1875 str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 1876 .num_gain_max_values, 1877 &(str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 1878 .str_tables)); 1879 if (err) return (err); 1880 } 1881 } 1882 1883 for (i = 0; i < str_p_loc_drc_coefficients_uni_drc->gain_set_count; i++) { 1884 WORD32 b; 1885 for (b = 0; 1886 b < 1887 str_p_loc_drc_coefficients_uni_drc->gain_set_params[i].band_count; 1888 b++) { 1889 str_p_loc_drc_coefficients_uni_drc 1890 ->gain_set_params_index_for_gain_sequence 1891 [str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 1892 .gain_params[b] 1893 .gain_seq_idx] = i; 1894 } 1895 } 1896 } 1897 return (0); 1898 } 1899 1900 WORD32 1901 impd_drc_parse_instructions_basic( 1902 ia_bit_buf_struct* it_bit_buff, 1903 ia_drc_instructions_basic_struct* str_drc_instructions_basic) { 1904 // WORD32 err = 0; 1905 WORD32 i, limiter_peak_target, temp; 1906 WORD32 additional_dmix_id_present, additional_dmix_id_cnt; 1907 1908 temp = impd_read_bits_buf(it_bit_buff, 18); 1909 if (it_bit_buff->error) return it_bit_buff->error; 1910 1911 str_drc_instructions_basic->drc_set_id = (temp >> 12) & 0x3f; 1912 str_drc_instructions_basic->drc_location = (temp >> 8) & 0xf; 1913 str_drc_instructions_basic->downmix_id[0] = (temp >> 1) & 0x7f; 1914 additional_dmix_id_present = temp & 1; 1915 str_drc_instructions_basic->dwnmix_id_count = 1; 1916 1917 if (additional_dmix_id_present) { 1918 additional_dmix_id_cnt = impd_read_bits_buf(it_bit_buff, 3); 1919 if (it_bit_buff->error) return it_bit_buff->error; 1920 for (i = 0; i < additional_dmix_id_cnt; i++) { 1921 str_drc_instructions_basic->downmix_id[i + 1] = 1922 impd_read_bits_buf(it_bit_buff, 7); 1923 if (it_bit_buff->error) return it_bit_buff->error; 1924 } 1925 str_drc_instructions_basic->dwnmix_id_count = 1 + additional_dmix_id_cnt; 1926 } 1927 1928 str_drc_instructions_basic->drc_set_effect = 1929 impd_read_bits_buf(it_bit_buff, 16); 1930 if (it_bit_buff->error) return it_bit_buff->error; 1931 1932 if ((str_drc_instructions_basic->drc_set_effect & 1933 (EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) == 0) { 1934 str_drc_instructions_basic->limiter_peak_target_present = 1935 impd_read_bits_buf(it_bit_buff, 1); 1936 if (it_bit_buff->error) return it_bit_buff->error; 1937 if (str_drc_instructions_basic->limiter_peak_target_present) { 1938 limiter_peak_target = impd_read_bits_buf(it_bit_buff, 8); 1939 if (it_bit_buff->error) return it_bit_buff->error; 1940 str_drc_instructions_basic->limiter_peak_target = 1941 -limiter_peak_target * 0.125f; 1942 } 1943 } 1944 1945 str_drc_instructions_basic->drc_set_target_loudness_present = 1946 impd_read_bits_buf(it_bit_buff, 1); 1947 if (it_bit_buff->error) return it_bit_buff->error; 1948 1949 str_drc_instructions_basic->drc_set_target_loudness_value_upper = 0; 1950 str_drc_instructions_basic->drc_set_target_loudness_value_lower = -63; 1951 1952 if (str_drc_instructions_basic->drc_set_target_loudness_present == 1) { 1953 WORD32 bsDrcSetTargetLoudnessValueUpper, bsDrcSetTargetLoudnessValueLower; 1954 bsDrcSetTargetLoudnessValueUpper = impd_read_bits_buf(it_bit_buff, 6); 1955 if (it_bit_buff->error) return it_bit_buff->error; 1956 str_drc_instructions_basic->drc_set_target_loudness_value_upper = 1957 bsDrcSetTargetLoudnessValueUpper - 63; 1958 1959 str_drc_instructions_basic->drc_set_target_loudness_value_lower_present = 1960 impd_read_bits_buf(it_bit_buff, 1); 1961 if (it_bit_buff->error) return it_bit_buff->error; 1962 1963 if (str_drc_instructions_basic 1964 ->drc_set_target_loudness_value_lower_present == 1) { 1965 bsDrcSetTargetLoudnessValueLower = impd_read_bits_buf(it_bit_buff, 6); 1966 if (it_bit_buff->error) return it_bit_buff->error; 1967 str_drc_instructions_basic->drc_set_target_loudness_value_lower = 1968 bsDrcSetTargetLoudnessValueLower - 63; 1969 } 1970 } 1971 1972 return (0); 1973 } 1974 1975 WORD32 1976 impd_dec_ducking_scaling(ia_bit_buf_struct* it_bit_buff, 1977 WORD32* ducking_scaling_flag, 1978 FLOAT32* p_ducking_scaling) { 1979 WORD32 ducking_scaling_present, ducking_scaling, sigma, mu; 1980 1981 ducking_scaling_present = impd_read_bits_buf(it_bit_buff, 1); 1982 if (it_bit_buff->error) return it_bit_buff->error; 1983 1984 if (ducking_scaling_present == 0) { 1985 *ducking_scaling_flag = 0; 1986 *p_ducking_scaling = 1.0f; 1987 } else { 1988 *ducking_scaling_flag = 1; 1989 ducking_scaling = impd_read_bits_buf(it_bit_buff, 4); 1990 if (it_bit_buff->error) return it_bit_buff->error; 1991 1992 sigma = ducking_scaling >> 3; 1993 mu = ducking_scaling & 0x7; 1994 1995 if (sigma == 0) { 1996 *p_ducking_scaling = 1.0f + 0.125f * (1.0f + mu); 1997 } else { 1998 *p_ducking_scaling = 1.0f - 0.125f * (1.0f + mu); 1999 } 2000 } 2001 return (0); 2002 } 2003 2004 WORD32 2005 impd_parse_drc_instructions_uni_drc( 2006 ia_bit_buf_struct* it_bit_buff, WORD32 version, ia_drc_config* drc_config, 2007 ia_drc_instructions_struct* str_drc_instruction_str) { 2008 WORD32 err = 0, i, n, k, g, c, limiter_peak_target, idx; 2009 WORD32 additional_dmix_id_present, additional_dmix_id_cnt; 2010 ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc = NULL; 2011 WORD32 ch_cnt; 2012 WORD32 unique_idx[MAX_CHANNEL_COUNT]; 2013 FLOAT32 unique_scaling[MAX_CHANNEL_COUNT]; 2014 WORD32 match; 2015 WORD32 dmix_id_present; 2016 WORD32 repeat_parameters, repeat_parameters_cnt; 2017 WORD32 ducking_sequence; 2018 FLOAT32 factor; 2019 2020 str_drc_instruction_str->drc_set_id = impd_read_bits_buf(it_bit_buff, 6); 2021 if (it_bit_buff->error) return it_bit_buff->error; 2022 if (str_drc_instruction_str->drc_set_id >= DRC_INSTRUCTIONS_COUNT_MAX) 2023 return UNEXPECTED_ERROR; 2024 if (version == 0) { 2025 str_drc_instruction_str->drc_set_complexity_level = 2026 DRC_COMPLEXITY_LEVEL_MAX; 2027 } else { 2028 str_drc_instruction_str->drc_set_complexity_level = 2029 impd_read_bits_buf(it_bit_buff, 4); 2030 if (it_bit_buff->error) return it_bit_buff->error; 2031 } 2032 str_drc_instruction_str->drc_location = impd_read_bits_buf(it_bit_buff, 4); 2033 if (it_bit_buff->error) return it_bit_buff->error; 2034 dmix_id_present = 1; 2035 if (version >= 1) { 2036 dmix_id_present = impd_read_bits_buf(it_bit_buff, 1); 2037 if (it_bit_buff->error) return it_bit_buff->error; 2038 } 2039 if (dmix_id_present == 1) { 2040 str_drc_instruction_str->downmix_id[0] = impd_read_bits_buf(it_bit_buff, 7); 2041 if (it_bit_buff->error) return it_bit_buff->error; 2042 if (version >= 1) { 2043 str_drc_instruction_str->drc_apply_to_dwnmix = 2044 impd_read_bits_buf(it_bit_buff, 1); 2045 if (it_bit_buff->error) return it_bit_buff->error; 2046 } 2047 if (version == 0) { 2048 if (str_drc_instruction_str->downmix_id[0] == 0) { 2049 str_drc_instruction_str->drc_apply_to_dwnmix = 0; 2050 } else { 2051 str_drc_instruction_str->drc_apply_to_dwnmix = 1; 2052 } 2053 } 2054 additional_dmix_id_present = impd_read_bits_buf(it_bit_buff, 1); 2055 if (it_bit_buff->error) return it_bit_buff->error; 2056 2057 if (additional_dmix_id_present) { 2058 additional_dmix_id_cnt = impd_read_bits_buf(it_bit_buff, 3); 2059 if (it_bit_buff->error) return it_bit_buff->error; 2060 for (i = 0; i < additional_dmix_id_cnt; i++) { 2061 str_drc_instruction_str->downmix_id[i + 1] = 2062 impd_read_bits_buf(it_bit_buff, 7); 2063 if (it_bit_buff->error) return it_bit_buff->error; 2064 } 2065 str_drc_instruction_str->dwnmix_id_count = 1 + additional_dmix_id_cnt; 2066 } else { 2067 str_drc_instruction_str->dwnmix_id_count = 1; 2068 } 2069 } else { 2070 str_drc_instruction_str->downmix_id[0] = 0; 2071 str_drc_instruction_str->dwnmix_id_count = 1; 2072 } 2073 2074 str_drc_instruction_str->drc_set_effect = impd_read_bits_buf(it_bit_buff, 16); 2075 if (it_bit_buff->error) return it_bit_buff->error; 2076 2077 if ((str_drc_instruction_str->drc_set_effect & 2078 (EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) == 0) { 2079 str_drc_instruction_str->limiter_peak_target_present = 2080 impd_read_bits_buf(it_bit_buff, 1); 2081 if (it_bit_buff->error) return it_bit_buff->error; 2082 if (str_drc_instruction_str->limiter_peak_target_present) { 2083 limiter_peak_target = impd_read_bits_buf(it_bit_buff, 8); 2084 if (it_bit_buff->error) return it_bit_buff->error; 2085 str_drc_instruction_str->limiter_peak_target = 2086 -limiter_peak_target * 0.125f; 2087 } 2088 } 2089 2090 str_drc_instruction_str->drc_set_target_loudness_present = 2091 impd_read_bits_buf(it_bit_buff, 1); 2092 if (it_bit_buff->error) return it_bit_buff->error; 2093 2094 str_drc_instruction_str->drc_set_target_loudness_value_upper = 0; 2095 str_drc_instruction_str->drc_set_target_loudness_value_lower = -63; 2096 2097 if (str_drc_instruction_str->drc_set_target_loudness_present == 1) { 2098 WORD32 bsDrcSetTargetLoudnessValueUpper, bsDrcSetTargetLoudnessValueLower; 2099 bsDrcSetTargetLoudnessValueUpper = impd_read_bits_buf(it_bit_buff, 6); 2100 if (it_bit_buff->error) return it_bit_buff->error; 2101 str_drc_instruction_str->drc_set_target_loudness_value_upper = 2102 bsDrcSetTargetLoudnessValueUpper - 63; 2103 str_drc_instruction_str->drc_set_target_loudness_value_lower_present = 2104 impd_read_bits_buf(it_bit_buff, 1); 2105 if (it_bit_buff->error) return it_bit_buff->error; 2106 if (str_drc_instruction_str->drc_set_target_loudness_value_lower_present == 2107 1) { 2108 bsDrcSetTargetLoudnessValueLower = impd_read_bits_buf(it_bit_buff, 6); 2109 if (it_bit_buff->error) return it_bit_buff->error; 2110 str_drc_instruction_str->drc_set_target_loudness_value_lower = 2111 bsDrcSetTargetLoudnessValueLower - 63; 2112 } 2113 } 2114 2115 str_drc_instruction_str->depends_on_drc_set_present = 2116 impd_read_bits_buf(it_bit_buff, 1); 2117 if (it_bit_buff->error) return it_bit_buff->error; 2118 2119 str_drc_instruction_str->no_independent_use = 0; 2120 if (str_drc_instruction_str->depends_on_drc_set_present) { 2121 str_drc_instruction_str->depends_on_drc_set = 2122 impd_read_bits_buf(it_bit_buff, 6); 2123 if (it_bit_buff->error) return it_bit_buff->error; 2124 } else { 2125 str_drc_instruction_str->no_independent_use = 2126 impd_read_bits_buf(it_bit_buff, 1); 2127 if (it_bit_buff->error) return it_bit_buff->error; 2128 } 2129 if (version == 0) { 2130 str_drc_instruction_str->requires_eq = 0; 2131 } else { 2132 str_drc_instruction_str->requires_eq = impd_read_bits_buf(it_bit_buff, 1); 2133 if (it_bit_buff->error) return it_bit_buff->error; 2134 } 2135 2136 err = impd_sel_drc_coeff(drc_config, str_drc_instruction_str->drc_location, 2137 &str_p_loc_drc_coefficients_uni_drc); 2138 if (err) return (err); 2139 2140 ch_cnt = drc_config->channel_layout.base_channel_count; 2141 2142 if (ch_cnt > MAX_CHANNEL_COUNT) return (UNEXPECTED_ERROR); 2143 for (c = 0; c < MAX_CHANNEL_COUNT; c++) { 2144 unique_idx[c] = -10; 2145 unique_scaling[c] = -10.0f; 2146 } 2147 2148 if (str_drc_instruction_str->drc_set_effect & 2149 (EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) { 2150 c = 0; 2151 while (c < ch_cnt) { 2152 WORD32 bs_gain_set_idx; 2153 bs_gain_set_idx = impd_read_bits_buf(it_bit_buff, 6); 2154 if (it_bit_buff->error) return it_bit_buff->error; 2155 if ((bs_gain_set_idx == 0) || (bs_gain_set_idx > GAIN_SET_COUNT_MAX)) 2156 return UNEXPECTED_ERROR; 2157 str_drc_instruction_str->gain_set_index[c] = bs_gain_set_idx - 1; 2158 impd_dec_ducking_scaling( 2159 it_bit_buff, 2160 &(str_drc_instruction_str->str_ducking_modifiers_for_channel[c] 2161 .ducking_scaling_flag), 2162 &(str_drc_instruction_str->str_ducking_modifiers_for_channel[c] 2163 .ducking_scaling)); 2164 2165 c++; 2166 2167 repeat_parameters = impd_read_bits_buf(it_bit_buff, 1); 2168 if (it_bit_buff->error) return it_bit_buff->error; 2169 2170 if (repeat_parameters == 1) { 2171 repeat_parameters_cnt = impd_read_bits_buf(it_bit_buff, 5); 2172 if (it_bit_buff->error) return it_bit_buff->error; 2173 2174 repeat_parameters_cnt += 1; 2175 if ((c + repeat_parameters_cnt) > MAX_CHANNEL_COUNT) 2176 return (UNEXPECTED_ERROR); 2177 for (k = 0; k < repeat_parameters_cnt; k++) { 2178 str_drc_instruction_str->gain_set_index[c] = 2179 str_drc_instruction_str->gain_set_index[c - 1]; 2180 str_drc_instruction_str->str_ducking_modifiers_for_channel[c] = 2181 str_drc_instruction_str->str_ducking_modifiers_for_channel[c - 1]; 2182 c++; 2183 } 2184 } 2185 } 2186 if (c > ch_cnt) { 2187 return (UNEXPECTED_ERROR); 2188 } 2189 ducking_sequence = -1; 2190 g = 0; 2191 if (str_drc_instruction_str->drc_set_effect & EFFECT_BIT_DUCK_OTHER) { 2192 for (c = 0; c < ch_cnt; c++) { 2193 match = 0; 2194 idx = str_drc_instruction_str->gain_set_index[c]; 2195 factor = str_drc_instruction_str->str_ducking_modifiers_for_channel[c] 2196 .ducking_scaling; 2197 if (idx < 0) { 2198 for (n = 0; n < g; n++) { 2199 if (unique_scaling[n] == factor) { 2200 match = 1; 2201 str_drc_instruction_str->channel_group_of_ch[c] = n; 2202 break; 2203 } 2204 } 2205 if (match == 0) { 2206 unique_idx[g] = idx; 2207 unique_scaling[g] = factor; 2208 str_drc_instruction_str->channel_group_of_ch[c] = g; 2209 g++; 2210 } 2211 } else { 2212 if ((ducking_sequence > 0) && (ducking_sequence != idx)) { 2213 /* drc for ducking can have only one ducking sequence */ 2214 return (UNEXPECTED_ERROR); 2215 } 2216 ducking_sequence = idx; 2217 str_drc_instruction_str->channel_group_of_ch[c] = -1; 2218 } 2219 } 2220 str_drc_instruction_str->num_drc_ch_groups = g; 2221 if (ducking_sequence == -1) { 2222 /* ducking sequence not found */ 2223 return (UNEXPECTED_ERROR); 2224 } 2225 } else if (str_drc_instruction_str->drc_set_effect & EFFECT_BIT_DUCK_SELF) { 2226 for (c = 0; c < ch_cnt; c++) { 2227 match = 0; 2228 idx = str_drc_instruction_str->gain_set_index[c]; 2229 factor = str_drc_instruction_str->str_ducking_modifiers_for_channel[c] 2230 .ducking_scaling; 2231 if (idx >= 0) { 2232 for (n = 0; n < g; n++) { 2233 if ((unique_idx[n] == idx) && (unique_scaling[n] == factor)) { 2234 match = 1; 2235 str_drc_instruction_str->channel_group_of_ch[c] = n; 2236 break; 2237 } 2238 } 2239 if (match == 0) { 2240 unique_idx[g] = idx; 2241 unique_scaling[g] = factor; 2242 str_drc_instruction_str->channel_group_of_ch[c] = g; 2243 g++; 2244 } 2245 } else { 2246 str_drc_instruction_str->channel_group_of_ch[c] = -1; 2247 } 2248 } 2249 str_drc_instruction_str->num_drc_ch_groups = g; 2250 } 2251 2252 if (str_drc_instruction_str->num_drc_ch_groups > 2253 min(CHANNEL_GROUP_COUNT_MAX, MAX_CHANNEL_COUNT)) 2254 return UNEXPECTED_ERROR; 2255 for (g = 0; g < str_drc_instruction_str->num_drc_ch_groups; g++) { 2256 WORD32 set = 2257 (str_drc_instruction_str->drc_set_effect & EFFECT_BIT_DUCK_OTHER) 2258 ? ducking_sequence 2259 : unique_idx[g]; 2260 str_drc_instruction_str->gain_set_index_for_channel_group[g] = set; 2261 str_drc_instruction_str->str_ducking_modifiers_for_channel_group[g] 2262 .ducking_scaling = unique_scaling[g]; 2263 if (unique_scaling[g] != 1.0f) { 2264 str_drc_instruction_str->str_ducking_modifiers_for_channel_group[g] 2265 .ducking_scaling_flag = 1; 2266 } else { 2267 str_drc_instruction_str->str_ducking_modifiers_for_channel_group[g] 2268 .ducking_scaling_flag = 0; 2269 } 2270 str_drc_instruction_str->band_count_of_ch_group[g] = 1; 2271 } 2272 } else { 2273 if (((version == 0) || 2274 (str_drc_instruction_str->drc_apply_to_dwnmix != 0)) && 2275 (str_drc_instruction_str->downmix_id[0] != 0) && 2276 (str_drc_instruction_str->downmix_id[0] != ID_FOR_ANY_DOWNMIX) && 2277 (str_drc_instruction_str->dwnmix_id_count == 1)) { 2278 for (i = 0; i < drc_config->dwnmix_instructions_count; i++) { 2279 if (str_drc_instruction_str->downmix_id[0] == 2280 drc_config->dwnmix_instructions[i].downmix_id) 2281 break; 2282 } 2283 if (i == drc_config->dwnmix_instructions_count) { 2284 /* dwnmix_instructions not found */ 2285 return (UNEXPECTED_ERROR); 2286 } 2287 ch_cnt = drc_config->dwnmix_instructions[i].target_channel_count; 2288 } else if (((version == 0) || 2289 (str_drc_instruction_str->drc_apply_to_dwnmix != 0)) && 2290 ((str_drc_instruction_str->downmix_id[0] == 2291 ID_FOR_ANY_DOWNMIX) || 2292 (str_drc_instruction_str->dwnmix_id_count > 1))) { 2293 ch_cnt = 1; 2294 } 2295 2296 if (ch_cnt > MAX_CHANNEL_COUNT) return (UNEXPECTED_ERROR); 2297 c = 0; 2298 while (c < ch_cnt) { 2299 WORD32 bs_gain_set_idx; 2300 WORD32 repeat_gain_set_idx, repeat_gain_set_idx_cnt, temp; 2301 2302 temp = impd_read_bits_buf(it_bit_buff, 7); 2303 if (it_bit_buff->error) return it_bit_buff->error; 2304 2305 bs_gain_set_idx = (temp >> 1) & 0x7f; 2306 repeat_gain_set_idx = temp & 1; 2307 2308 if ((bs_gain_set_idx == 0) || (bs_gain_set_idx > GAIN_SET_COUNT_MAX)) 2309 return UNEXPECTED_ERROR; 2310 2311 str_drc_instruction_str->gain_set_index[c] = bs_gain_set_idx - 1; 2312 c++; 2313 2314 if (repeat_gain_set_idx == 1) { 2315 repeat_gain_set_idx_cnt = impd_read_bits_buf(it_bit_buff, 5); 2316 if (it_bit_buff->error) return it_bit_buff->error; 2317 2318 repeat_gain_set_idx_cnt += 1; 2319 if ((c + repeat_gain_set_idx_cnt) > MAX_CHANNEL_COUNT) 2320 return (UNEXPECTED_ERROR); 2321 for (k = 0; k < repeat_gain_set_idx_cnt; k++) { 2322 str_drc_instruction_str->gain_set_index[c] = bs_gain_set_idx - 1; 2323 c++; 2324 } 2325 } 2326 } 2327 if (c > ch_cnt) { 2328 return (UNEXPECTED_ERROR); 2329 } 2330 2331 g = 0; 2332 if ((str_drc_instruction_str->downmix_id[0] == ID_FOR_ANY_DOWNMIX) || 2333 (str_drc_instruction_str->dwnmix_id_count > 1)) { 2334 WORD32 idx = str_drc_instruction_str->gain_set_index[0]; 2335 if (idx >= 0) { 2336 unique_idx[0] = idx; 2337 g = 1; 2338 } 2339 } else { 2340 for (c = 0; c < ch_cnt; c++) { 2341 WORD32 idx = str_drc_instruction_str->gain_set_index[c]; 2342 match = 0; 2343 if (idx >= 0) { 2344 for (n = 0; n < g; n++) { 2345 if (unique_idx[n] == idx) { 2346 match = 1; 2347 str_drc_instruction_str->channel_group_of_ch[c] = n; 2348 break; 2349 } 2350 } 2351 if (match == 0) { 2352 unique_idx[g] = idx; 2353 str_drc_instruction_str->channel_group_of_ch[c] = g; 2354 g++; 2355 } 2356 } else { 2357 str_drc_instruction_str->channel_group_of_ch[c] = -1; 2358 } 2359 } 2360 } 2361 2362 str_drc_instruction_str->num_drc_ch_groups = g; 2363 2364 if (str_drc_instruction_str->num_drc_ch_groups > 2365 min(CHANNEL_GROUP_COUNT_MAX, MAX_CHANNEL_COUNT)) 2366 return UNEXPECTED_ERROR; 2367 for (g = 0; g < str_drc_instruction_str->num_drc_ch_groups; g++) { 2368 WORD32 set, band_count; 2369 2370 set = unique_idx[g]; 2371 str_drc_instruction_str->gain_set_index_for_channel_group[g] = set; 2372 2373 if (str_p_loc_drc_coefficients_uni_drc != NULL && 2374 set < str_p_loc_drc_coefficients_uni_drc->gain_set_count) { 2375 band_count = 2376 str_p_loc_drc_coefficients_uni_drc->gain_set_params[set].band_count; 2377 } else { 2378 band_count = 1; 2379 } 2380 2381 err = impd_dec_gain_modifiers( 2382 it_bit_buff, version, band_count, 2383 &(str_drc_instruction_str->str_gain_modifiers_of_ch_group[g])); 2384 if (err) return (err); 2385 } 2386 } 2387 2388 return (0); 2389 } 2390 WORD32 2391 impd_parse_loudness_info(ia_bit_buf_struct* it_bit_buff, WORD32 version, 2392 ia_loudness_info_struct* loudness_info) { 2393 WORD32 err = 0, sample_peak_level, true_peak_level, i, temp; 2394 2395 loudness_info->drc_set_id = impd_read_bits_buf(it_bit_buff, 6); 2396 if (it_bit_buff->error) return it_bit_buff->error; 2397 2398 if (version >= 1) { 2399 loudness_info->eq_set_id = impd_read_bits_buf(it_bit_buff, 6); 2400 if (it_bit_buff->error) return it_bit_buff->error; 2401 } else { 2402 loudness_info->eq_set_id = 0; 2403 } 2404 2405 temp = impd_read_bits_buf(it_bit_buff, 8); 2406 if (it_bit_buff->error) return it_bit_buff->error; 2407 2408 loudness_info->downmix_id = (temp >> 1) & 0x7f; 2409 loudness_info->sample_peak_level_present = temp & 1; 2410 2411 if (loudness_info->sample_peak_level_present) { 2412 sample_peak_level = impd_read_bits_buf(it_bit_buff, 12); 2413 if (it_bit_buff->error) return it_bit_buff->error; 2414 2415 if (sample_peak_level == 0) { 2416 loudness_info->sample_peak_level_present = 0; 2417 loudness_info->sample_peak_level = 0.0f; 2418 } else { 2419 loudness_info->sample_peak_level = 20.0f - sample_peak_level * 0.03125f; 2420 } 2421 } 2422 2423 loudness_info->true_peak_level_present = impd_read_bits_buf(it_bit_buff, 1); 2424 if (it_bit_buff->error) return it_bit_buff->error; 2425 2426 if (loudness_info->true_peak_level_present) { 2427 true_peak_level = impd_read_bits_buf(it_bit_buff, 12); 2428 if (it_bit_buff->error) return it_bit_buff->error; 2429 2430 if (true_peak_level == 0) { 2431 loudness_info->true_peak_level_present = 0; 2432 loudness_info->true_peak_level = 0.0f; 2433 } else { 2434 loudness_info->true_peak_level = 20.0f - true_peak_level * 0.03125f; 2435 } 2436 2437 temp = impd_read_bits_buf(it_bit_buff, 6); 2438 if (it_bit_buff->error) return it_bit_buff->error; 2439 2440 /* Parsed but unused */ 2441 loudness_info->true_peak_level_measurement_system = (temp >> 2) & 0xf; 2442 /* Parsed but unused */ 2443 loudness_info->true_peak_level_reliability = temp & 3; 2444 } 2445 2446 loudness_info->measurement_count = impd_read_bits_buf(it_bit_buff, 4); 2447 if (it_bit_buff->error) return it_bit_buff->error; 2448 2449 for (i = 0; i < loudness_info->measurement_count; i++) { 2450 err = impd_parse_loudness_measure(it_bit_buff, 2451 &(loudness_info->loudness_measure[i])); 2452 if (err) return (err); 2453 } 2454 2455 return (0); 2456 } 2457