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 for (i = 0; i < str_drc_coeff_param_drc->parametric_drc_gain_set_count; i++) { 552 err = impd_parametric_drc_parse_gain_set_params( 553 it_bit_buff, drc_config, 554 &(str_drc_coeff_param_drc->str_parametric_drc_gain_set_params[i])); 555 if (err) return (err); 556 } 557 558 return 0; 559 } 560 561 static WORD32 impd_parse_parametric_drc_instructions( 562 ia_bit_buf_struct* it_bit_buff, WORD32 parametric_drc_frame_size, 563 ia_parametric_drc_instructions_struct* str_parametric_drc_instructions) { 564 WORD32 i = 0, err = 0, temp; 565 WORD32 bit_size_len, bit_size, other_bit; 566 567 str_parametric_drc_instructions->drc_characteristic = 0; 568 str_parametric_drc_instructions->disable_paramteric_drc = 0; 569 570 temp = impd_read_bits_buf(it_bit_buff, 5); 571 if (it_bit_buff->error) return it_bit_buff->error; 572 573 str_parametric_drc_instructions->parametric_drc_id = (temp >> 1) & 0xf; 574 str_parametric_drc_instructions->parametric_drc_look_ahead_flag = temp & 1; 575 576 if (str_parametric_drc_instructions->parametric_drc_look_ahead_flag) { 577 str_parametric_drc_instructions->parametric_drc_look_ahead = 578 impd_read_bits_buf(it_bit_buff, 7); 579 if (it_bit_buff->error) return it_bit_buff->error; 580 } else { 581 str_parametric_drc_instructions->parametric_drc_look_ahead = 0; 582 } 583 584 str_parametric_drc_instructions->parametric_drc_preset_id_present = 585 impd_read_bits_buf(it_bit_buff, 1); 586 if (it_bit_buff->error) return it_bit_buff->error; 587 588 if (str_parametric_drc_instructions->parametric_drc_preset_id_present) { 589 str_parametric_drc_instructions->parametric_drc_preset_id = 590 impd_read_bits_buf(it_bit_buff, 7); 591 if (it_bit_buff->error) return it_bit_buff->error; 592 593 switch (str_parametric_drc_instructions->parametric_drc_preset_id) { 594 case 0: 595 case 1: 596 case 2: 597 case 3: 598 case 4: 599 str_parametric_drc_instructions->drc_characteristic = 600 str_parametric_drc_instructions->parametric_drc_preset_id + 7; 601 str_parametric_drc_instructions->parametric_drc_type = 602 PARAM_DRC_TYPE_FF; 603 604 str_parametric_drc_instructions->str_parametric_drc_type_feed_forward 605 .level_estim_k_weighting_type = 2; 606 str_parametric_drc_instructions->str_parametric_drc_type_feed_forward 607 .level_estim_integration_time = parametric_drc_frame_size; 608 609 impd_parametric_drc_ffwd_init_drc_curve_params( 610 str_parametric_drc_instructions->drc_characteristic, 611 &str_parametric_drc_instructions 612 ->str_parametric_drc_type_feed_forward); 613 impd_parametric_drc_ffwd_init_drc_gain_smooth_params( 614 str_parametric_drc_instructions->drc_characteristic, 615 &str_parametric_drc_instructions 616 ->str_parametric_drc_type_feed_forward); 617 618 break; 619 default: 620 str_parametric_drc_instructions->disable_paramteric_drc = 1; 621 break; 622 } 623 } else { 624 str_parametric_drc_instructions->parametric_drc_type = 625 impd_read_bits_buf(it_bit_buff, 3); 626 if (it_bit_buff->error) return it_bit_buff->error; 627 628 if (str_parametric_drc_instructions->parametric_drc_type == 629 PARAM_DRC_TYPE_FF) { 630 err = impd_parse_parametric_drc_ffwd( 631 it_bit_buff, parametric_drc_frame_size, 632 &(str_parametric_drc_instructions 633 ->str_parametric_drc_type_feed_forward)); 634 if (err) return (err); 635 str_parametric_drc_instructions->disable_paramteric_drc = 636 str_parametric_drc_instructions->str_parametric_drc_type_feed_forward 637 .disable_paramteric_drc; 638 str_parametric_drc_instructions->drc_characteristic = 639 str_parametric_drc_instructions->str_parametric_drc_type_feed_forward 640 .drc_characteristic; 641 } else if (str_parametric_drc_instructions->parametric_drc_type == 642 PARAM_DRC_TYPE_LIM) { 643 err = impd_parse_parametric_drc_lim( 644 it_bit_buff, &(str_parametric_drc_instructions->parametric_drc_lim)); 645 if (err) return (err); 646 str_parametric_drc_instructions->disable_paramteric_drc = 647 str_parametric_drc_instructions->parametric_drc_lim 648 .disable_paramteric_drc; 649 str_parametric_drc_instructions->drc_characteristic = 650 str_parametric_drc_instructions->parametric_drc_lim 651 .drc_characteristic; 652 if (str_parametric_drc_instructions->parametric_drc_look_ahead_flag) { 653 str_parametric_drc_instructions->parametric_drc_lim 654 .parametric_lim_attack = 655 str_parametric_drc_instructions->parametric_drc_look_ahead; 656 } 657 } else { 658 bit_size_len = impd_read_bits_buf(it_bit_buff, 3) + 4; 659 if (it_bit_buff->error) return it_bit_buff->error; 660 661 bit_size = impd_read_bits_buf(it_bit_buff, bit_size_len); 662 if (it_bit_buff->error) return it_bit_buff->error; 663 str_parametric_drc_instructions->len_bit_size = bit_size + 1; 664 665 switch (str_parametric_drc_instructions->parametric_drc_type) { 666 default: 667 str_parametric_drc_instructions->disable_paramteric_drc = 1; 668 for (i = 0; i < str_parametric_drc_instructions->len_bit_size; i++) { 669 other_bit = impd_read_bits_buf(it_bit_buff, 1); 670 if (it_bit_buff->error) return it_bit_buff->error; 671 } 672 break; 673 } 674 } 675 } 676 677 return 0; 678 } 679 680 WORD32 impd_parse_loud_info_set_ext_eq( 681 ia_bit_buf_struct* it_bit_buff, 682 ia_drc_loudness_info_set_struct* loudness_info_set) { 683 WORD32 err, i, offset, version = 1, temp; 684 WORD32 loudness_info_v1_album_cnt, loudness_info_v1_cnt; 685 686 temp = impd_read_bits_buf(it_bit_buff, 12); 687 if (it_bit_buff->error) return it_bit_buff->error; 688 689 loudness_info_v1_album_cnt = (temp >> 6) & 0x3f; 690 loudness_info_v1_cnt = temp & 0x3f; 691 692 offset = loudness_info_set->loudness_info_album_count; 693 loudness_info_set->loudness_info_album_count += loudness_info_v1_album_cnt; 694 for (i = 0; i < loudness_info_v1_album_cnt; i++) { 695 err = impd_parse_loudness_info( 696 it_bit_buff, version, 697 &loudness_info_set->str_loudness_info_album[i + offset]); 698 if (err) return (err); 699 } 700 offset = loudness_info_set->loudness_info_count; 701 loudness_info_set->loudness_info_count += loudness_info_v1_cnt; 702 for (i = 0; i < loudness_info_v1_cnt; i++) { 703 err = impd_parse_loudness_info( 704 it_bit_buff, version, &loudness_info_set->loudness_info[i + offset]); 705 if (err) return (err); 706 } 707 return (0); 708 } 709 710 WORD32 impd_parse_ch_layout(ia_bit_buf_struct* it_bit_buff, 711 ia_drc_params_bs_dec_struct* ia_drc_params_struct, 712 ia_channel_layout_struct* channel_layout) { 713 // WORD32 err = 0; 714 WORD32 i; 715 716 channel_layout->base_channel_count = impd_read_bits_buf(it_bit_buff, 7); 717 if (it_bit_buff->error) return it_bit_buff->error; 718 if (ia_drc_params_struct->lfe_channel_map_count != -1 && 719 channel_layout->base_channel_count != 720 ia_drc_params_struct->lfe_channel_map_count) { 721 return (UNEXPECTED_ERROR); 722 } 723 channel_layout->layout_signaling_present = impd_read_bits_buf(it_bit_buff, 1); 724 if (it_bit_buff->error) return it_bit_buff->error; 725 726 if (channel_layout->layout_signaling_present) { 727 channel_layout->defined_layout = impd_read_bits_buf(it_bit_buff, 8); 728 if (it_bit_buff->error) return it_bit_buff->error; 729 730 if (channel_layout->defined_layout == 0) { 731 for (i = 0; i < channel_layout->base_channel_count; i++) { 732 channel_layout->speaker_position[i] = 733 impd_read_bits_buf(it_bit_buff, 7); 734 if (it_bit_buff->error) return it_bit_buff->error; 735 if (channel_layout->speaker_position[i] == 3 || 736 channel_layout->speaker_position[i] == 26) { 737 ia_drc_params_struct->lfe_channel_map[i] = 1; 738 } else { 739 ia_drc_params_struct->lfe_channel_map[i] = 0; 740 } 741 } 742 } 743 } 744 745 return (0); 746 } 747 748 WORD32 749 impd_parse_dwnmix_instructions( 750 ia_bit_buf_struct* it_bit_buff, WORD32 version, 751 ia_drc_params_bs_dec_struct* ia_drc_params_struct, 752 ia_channel_layout_struct* channel_layout, 753 ia_downmix_instructions_struct* dwnmix_instructions) { 754 // WORD32 err = 0; 755 WORD32 i, j, k, temp; 756 757 temp = impd_read_bits_buf(it_bit_buff, 23); 758 if (it_bit_buff->error) return it_bit_buff->error; 759 760 dwnmix_instructions->downmix_id = (temp >> 16) & 0x7f; 761 dwnmix_instructions->target_channel_count = (temp >> 9) & 0x7f; 762 dwnmix_instructions->target_layout = (temp >> 1) & 0xff; 763 dwnmix_instructions->downmix_coefficients_present = temp & 1; 764 765 if (dwnmix_instructions->downmix_coefficients_present) { 766 if (version == 0) { 767 WORD32 dmix_coeff; 768 k = 0; 769 for (i = 0; i < dwnmix_instructions->target_channel_count; i++) { 770 for (j = 0; j < channel_layout->base_channel_count; j++) { 771 dmix_coeff = impd_read_bits_buf(it_bit_buff, 4); 772 if (it_bit_buff->error) return it_bit_buff->error; 773 774 if (ia_drc_params_struct->lfe_channel_map[j]) { 775 dwnmix_instructions->downmix_coefficient[k] = 776 (FLOAT32)pow(10.0f, 0.05f * dwnmix_coeff_lfe[dmix_coeff]); 777 } else { 778 dwnmix_instructions->downmix_coefficient[k] = 779 (FLOAT32)pow(10.0f, 0.05f * dwnmix_coeff[dmix_coeff]); 780 } 781 k++; 782 } 783 } 784 } else { 785 WORD32 dmix_coeff_v1, bs_dmix_offset; 786 FLOAT32 a, b, dmix_offset, sum; 787 788 bs_dmix_offset = impd_read_bits_buf(it_bit_buff, 4); 789 if (it_bit_buff->error) return it_bit_buff->error; 790 k = 0; 791 for (i = 0; i < dwnmix_instructions->target_channel_count; i++) { 792 for (j = 0; j < channel_layout->base_channel_count; j++) { 793 dmix_coeff_v1 = impd_read_bits_buf(it_bit_buff, 5); 794 if (it_bit_buff->error) return it_bit_buff->error; 795 dwnmix_instructions->downmix_coefficient[k] = 796 dwnmix_coeff_v1[dmix_coeff_v1]; 797 k++; 798 } 799 } 800 switch (bs_dmix_offset) { 801 case 0: 802 dmix_offset = 0.0f; 803 break; 804 case 1: 805 a = 20.0f * (FLOAT32)log10( 806 (FLOAT32)dwnmix_instructions->target_channel_count / 807 (FLOAT32)channel_layout->base_channel_count); 808 dmix_offset = 0.5f * (FLOAT32)floor(0.5f + a); 809 break; 810 case 2: 811 a = 20.0f * (FLOAT32)log10( 812 (FLOAT32)dwnmix_instructions->target_channel_count / 813 (FLOAT32)channel_layout->base_channel_count); 814 dmix_offset = 0.5f * (FLOAT32)floor(0.5f + 2.0f * a); 815 break; 816 case 3: 817 sum = 0.0f; 818 for (k = 0; k < dwnmix_instructions->target_channel_count * 819 channel_layout->base_channel_count; 820 k++) { 821 sum += (FLOAT32)pow( 822 10.0f, 0.1f * dwnmix_instructions->downmix_coefficient[k]); 823 } 824 b = 10.0f * (FLOAT32)log10(sum); 825 dmix_offset = 0.5f * (FLOAT32)floor(0.5f + 2.0f * b); 826 break; 827 828 default: 829 return (BITSTREAM_ERROR); 830 break; 831 } 832 for (k = 0; k < dwnmix_instructions->target_channel_count * 833 channel_layout->base_channel_count; 834 k++) { 835 dwnmix_instructions->downmix_coefficient[k] = (FLOAT32)pow( 836 10.0f, 0.05f * (dwnmix_instructions->downmix_coefficient[k] + 837 dmix_offset)); 838 } 839 } 840 } 841 return (0); 842 } 843 844 VOID impd_drc_gen_instructions_for_drc_off(ia_drc_config* drc_config) { 845 WORD32 i, k, s; 846 ia_drc_instructions_struct* str_drc_instruction_str; 847 s = -1; 848 849 k = drc_config->drc_instructions_uni_drc_count; 850 851 str_drc_instruction_str = &(drc_config->str_drc_instruction_str[k]); 852 memset(str_drc_instruction_str, 0, sizeof(ia_drc_instructions_struct)); 853 str_drc_instruction_str->drc_set_id = s; 854 s--; 855 str_drc_instruction_str->downmix_id[0] = ID_FOR_BASE_LAYOUT; 856 str_drc_instruction_str->dwnmix_id_count = 1; 857 str_drc_instruction_str->drc_apply_to_dwnmix = 0; 858 str_drc_instruction_str->depends_on_drc_set_present = 0; 859 str_drc_instruction_str->no_independent_use = 0; 860 str_drc_instruction_str->gain_element_count = 0; 861 for (i = 1; i < drc_config->dwnmix_instructions_count + 1; i++) { 862 str_drc_instruction_str = &(drc_config->str_drc_instruction_str[k + i]); 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->drc_set_complexity_level = 0; 867 str_drc_instruction_str->requires_eq = 0; 868 str_drc_instruction_str->downmix_id[0] = 869 drc_config->dwnmix_instructions[i - 1].downmix_id; 870 str_drc_instruction_str->dwnmix_id_count = 1; 871 str_drc_instruction_str->drc_apply_to_dwnmix = 0; 872 str_drc_instruction_str->depends_on_drc_set_present = 0; 873 str_drc_instruction_str->no_independent_use = 0; 874 str_drc_instruction_str->gain_element_count = 0; 875 } 876 drc_config->drc_instructions_count_plus = 877 drc_config->drc_instructions_uni_drc_count + 878 drc_config->dwnmix_instructions_count + 1; 879 return; 880 } 881 882 WORD32 883 impd_parse_drc_config_ext(ia_bit_buf_struct* it_bit_buff, 884 ia_drc_params_bs_dec_struct* ia_drc_params_struct, 885 ia_drc_config* drc_config, 886 ia_drc_config_ext* str_drc_config_ext) { 887 WORD32 err = 0, i, k; 888 WORD32 bit_size_len, ext_size_bits, bit_size, other_bit; 889 890 k = 0; 891 str_drc_config_ext->drc_config_ext_type[k] = 892 impd_read_bits_buf(it_bit_buff, 4); 893 if (it_bit_buff->error) return it_bit_buff->error; 894 while (str_drc_config_ext->drc_config_ext_type[k] != UNIDRCCONFEXT_TERM) { 895 bit_size_len = impd_read_bits_buf(it_bit_buff, 4); 896 if (it_bit_buff->error) return it_bit_buff->error; 897 ext_size_bits = bit_size_len + 4; 898 899 bit_size = impd_read_bits_buf(it_bit_buff, ext_size_bits); 900 if (it_bit_buff->error) return it_bit_buff->error; 901 str_drc_config_ext->ext_bit_size[k] = bit_size + 1; 902 903 switch (str_drc_config_ext->drc_config_ext_type[k]) { 904 case UNIDRCCONFEXT_PARAM_DRC: 905 str_drc_config_ext->parametric_drc_present = 1; 906 err = impd_parametic_drc_parse_coeff( 907 it_bit_buff, drc_config, 908 &(str_drc_config_ext->str_drc_coeff_param_drc)); 909 if (err) return (err); 910 str_drc_config_ext->parametric_drc_instructions_count = 911 impd_read_bits_buf(it_bit_buff, 4); 912 if (it_bit_buff->error) return it_bit_buff->error; 913 for (i = 0; i < str_drc_config_ext->parametric_drc_instructions_count; 914 i++) { 915 err = impd_parse_parametric_drc_instructions( 916 it_bit_buff, str_drc_config_ext->str_drc_coeff_param_drc 917 .parametric_drc_frame_size, 918 &(str_drc_config_ext->str_parametric_drc_instructions[i])); 919 if (err) return (err); 920 } 921 break; 922 case UNIDRCCONFEXT_V1: 923 str_drc_config_ext->drc_extension_v1_present = 1; 924 err = impd_parse_drc_ext_v1(it_bit_buff, ia_drc_params_struct, 925 drc_config, str_drc_config_ext); 926 if (err) return (err); 927 break; 928 default: 929 for (i = 0; i < str_drc_config_ext->ext_bit_size[k]; i++) { 930 other_bit = impd_read_bits_buf(it_bit_buff, 1); 931 if (it_bit_buff->error) return it_bit_buff->error; 932 } 933 break; 934 } 935 k++; 936 str_drc_config_ext->drc_config_ext_type[k] = 937 impd_read_bits_buf(it_bit_buff, 4); 938 if (it_bit_buff->error) return it_bit_buff->error; 939 } 940 941 return (0); 942 } 943 944 static WORD32 impd_parse_split_drc_characteristic( 945 ia_bit_buf_struct* it_bit_buff, const WORD32 side, 946 ia_split_drc_characteristic_struct* split_drc_characteristic) { 947 // WORD32 err = 0; 948 WORD32 i, temp; 949 950 split_drc_characteristic->characteristic_format = 951 impd_read_bits_buf(it_bit_buff, 1); 952 if (it_bit_buff->error) return it_bit_buff->error; 953 if (split_drc_characteristic->characteristic_format == 0) { 954 WORD32 bsGain, bsIoRatio, bsExp; 955 bsGain = impd_read_bits_buf(it_bit_buff, 6); 956 if (it_bit_buff->error) return it_bit_buff->error; 957 if (side == LEFT_SIDE) { 958 split_drc_characteristic->gain = (FLOAT32)bsGain; 959 } else { 960 split_drc_characteristic->gain = (FLOAT32)-bsGain; 961 } 962 temp = impd_read_bits_buf(it_bit_buff, 8); 963 if (it_bit_buff->error) return it_bit_buff->error; 964 965 bsIoRatio = (temp >> 4) & 0xf; 966 bsExp = temp & 0xf; 967 split_drc_characteristic->in_out_ratio = 0.05f + 0.15f * bsIoRatio; 968 969 if (bsExp < 15) { 970 split_drc_characteristic->exp = 1.0f + 2.0f * bsExp; 971 } else { 972 split_drc_characteristic->exp = 1000.0f; 973 } 974 split_drc_characteristic->flip_sign = impd_read_bits_buf(it_bit_buff, 1); 975 if (it_bit_buff->error) return it_bit_buff->error; 976 } else { 977 WORD32 char_node_cnt, node_level_delta, node_gain; 978 char_node_cnt = impd_read_bits_buf(it_bit_buff, 2); 979 if (it_bit_buff->error) return it_bit_buff->error; 980 split_drc_characteristic->characteristic_node_count = char_node_cnt + 1; 981 split_drc_characteristic->node_level[0] = DRC_INPUT_LOUDNESS_TARGET; 982 split_drc_characteristic->node_gain[0] = 0.0f; 983 for (i = 1; i <= split_drc_characteristic->characteristic_node_count; i++) { 984 node_level_delta = impd_read_bits_buf(it_bit_buff, 5); 985 if (it_bit_buff->error) return it_bit_buff->error; 986 if (side == LEFT_SIDE) { 987 split_drc_characteristic->node_level[i] = 988 split_drc_characteristic->node_level[i - 1] - 989 (1.0f + node_level_delta); 990 } else { 991 split_drc_characteristic->node_level[i] = 992 split_drc_characteristic->node_level[i - 1] + 993 (1.0f + node_level_delta); 994 } 995 node_gain = impd_read_bits_buf(it_bit_buff, 8); 996 if (it_bit_buff->error) return it_bit_buff->error; 997 split_drc_characteristic->node_gain[i] = 0.5f * node_gain - 64.0f; 998 } 999 } 1000 return (0); 1001 } 1002 1003 WORD32 1004 impd_drc_gen_instructions_derived_data( 1005 ia_drc_config* drc_config, 1006 ia_drc_params_bs_dec_struct* ia_drc_params_struct, 1007 ia_drc_instructions_struct* str_drc_instruction_str) { 1008 WORD32 n, g; 1009 ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc = NULL; 1010 ia_drc_coeff_parametric_drc_struct* str_drc_coeff_param_drc = NULL; 1011 WORD32 gain_element_count = 0; 1012 1013 for (n = 0; n < drc_config->drc_coefficients_drc_count; n++) { 1014 if (drc_config->str_p_loc_drc_coefficients_uni_drc[n].drc_location == 1015 str_drc_instruction_str->drc_location) 1016 break; 1017 } 1018 if ((n == drc_config->drc_coefficients_drc_count) && 1019 (drc_config->drc_coefficients_drc_count > 0)) { 1020 return -1; 1021 } 1022 str_p_loc_drc_coefficients_uni_drc = 1023 &(drc_config->str_p_loc_drc_coefficients_uni_drc[n]); 1024 1025 if (drc_config->drc_config_ext_present && 1026 drc_config->str_drc_config_ext.parametric_drc_present && 1027 drc_config->str_drc_config_ext.str_drc_coeff_param_drc.drc_location == 1028 str_drc_instruction_str->drc_location) { 1029 str_drc_coeff_param_drc = 1030 &drc_config->str_drc_config_ext.str_drc_coeff_param_drc; 1031 } 1032 1033 for (g = 0; g < str_drc_instruction_str->num_drc_ch_groups; g++) { 1034 WORD32 seq = str_drc_instruction_str->gain_set_index_for_channel_group[g]; 1035 if (seq != -1 && 1036 (drc_config->drc_coefficients_drc_count == 0 || 1037 seq >= str_p_loc_drc_coefficients_uni_drc->gain_set_count)) { 1038 str_drc_instruction_str->ch_group_parametric_drc_flag[g] = 1; 1039 if (drc_config->drc_coefficients_drc_count != 0) { 1040 seq = seq - str_p_loc_drc_coefficients_uni_drc->gain_set_count; 1041 } 1042 str_drc_instruction_str->gain_set_idx_of_ch_group_parametric_drc[g] = seq; 1043 1044 if (str_drc_coeff_param_drc == NULL || 1045 seq >= str_drc_coeff_param_drc->parametric_drc_gain_set_count) { 1046 /* parametric drc gain set not available */ 1047 return (EXTERNAL_ERROR); 1048 } 1049 str_drc_instruction_str->gain_interpolation_type_for_channel_group[g] = 1; 1050 str_drc_instruction_str->time_delta_min_for_channel_group[g] = 1051 str_drc_coeff_param_drc->parametric_drc_frame_size; 1052 str_drc_instruction_str->time_alignment_for_channel_group[g] = 0; 1053 } else { 1054 str_drc_instruction_str->ch_group_parametric_drc_flag[g] = 0; 1055 } 1056 if (str_drc_instruction_str->ch_group_parametric_drc_flag[g] == 0) { 1057 if (seq >= str_p_loc_drc_coefficients_uni_drc->gain_set_count) { 1058 return -1; 1059 } 1060 str_drc_instruction_str->gain_interpolation_type_for_channel_group[g] = 1061 str_p_loc_drc_coefficients_uni_drc->gain_set_params[seq] 1062 .gain_interpolation_type; 1063 if (str_p_loc_drc_coefficients_uni_drc->gain_set_params[seq] 1064 .time_delt_min_flag) { 1065 str_drc_instruction_str->time_delta_min_for_channel_group[g] = 1066 str_p_loc_drc_coefficients_uni_drc->gain_set_params[seq] 1067 .time_delt_min_val; 1068 } else { 1069 str_drc_instruction_str->time_delta_min_for_channel_group[g] = 1070 ia_drc_params_struct->delta_tmin_default; 1071 } 1072 str_drc_instruction_str->time_alignment_for_channel_group[g] = 1073 str_p_loc_drc_coefficients_uni_drc->gain_set_params[seq] 1074 .time_alignment; 1075 } 1076 } 1077 1078 if (str_drc_instruction_str->drc_set_effect & 1079 (EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) { 1080 str_drc_instruction_str->gain_element_count = 1081 str_drc_instruction_str->num_drc_ch_groups; 1082 } else { 1083 for (g = 0; g < str_drc_instruction_str->num_drc_ch_groups; g++) { 1084 if (str_drc_instruction_str->ch_group_parametric_drc_flag[g] == 1) { 1085 gain_element_count++; 1086 str_drc_instruction_str->band_count_of_ch_group[g] = 1; 1087 } else { 1088 WORD32 seq, band_count; 1089 seq = str_drc_instruction_str->gain_set_index_for_channel_group[g]; 1090 band_count = 1091 str_p_loc_drc_coefficients_uni_drc->gain_set_params[seq].band_count; 1092 str_drc_instruction_str->band_count_of_ch_group[g] = band_count; 1093 gain_element_count += band_count; 1094 } 1095 } 1096 str_drc_instruction_str->gain_element_count = gain_element_count; 1097 } 1098 1099 return (0); 1100 } 1101 1102 WORD32 1103 impd_parse_drc_config(ia_bit_buf_struct* it_bit_buff, 1104 ia_drc_params_bs_dec_struct* ia_drc_params_struct, 1105 ia_drc_config* drc_config) { 1106 WORD32 i, err = 0, temp; 1107 WORD32 version = 0; 1108 1109 drc_config->sample_rate_present = impd_read_bits_buf(it_bit_buff, 1); 1110 if (it_bit_buff->error) return it_bit_buff->error; 1111 1112 if (drc_config->sample_rate_present == 1) { 1113 WORD32 bssample_rate; 1114 bssample_rate = impd_read_bits_buf(it_bit_buff, 18); 1115 if (it_bit_buff->error) return it_bit_buff->error; 1116 drc_config->sampling_rate = bssample_rate + 1000; 1117 } 1118 1119 temp = impd_read_bits_buf(it_bit_buff, 8); 1120 if (it_bit_buff->error) return it_bit_buff->error; 1121 1122 drc_config->dwnmix_instructions_count = (temp >> 1) & 0x7f; 1123 drc_config->drc_description_basic_present = temp & 1; 1124 1125 if (drc_config->drc_description_basic_present == 1) { 1126 temp = impd_read_bits_buf(it_bit_buff, 7); 1127 if (it_bit_buff->error) return it_bit_buff->error; 1128 1129 drc_config->drc_coefficients_basic_count = (temp >> 4) & 7; 1130 drc_config->drc_instructions_basic_count = temp & 0xf; 1131 1132 } else { 1133 drc_config->drc_coefficients_basic_count = 0; 1134 drc_config->drc_instructions_basic_count = 0; 1135 } 1136 1137 temp = impd_read_bits_buf(it_bit_buff, 9); 1138 if (it_bit_buff->error) return it_bit_buff->error; 1139 1140 drc_config->drc_coefficients_drc_count = (temp >> 6) & 7; 1141 drc_config->drc_instructions_uni_drc_count = temp & 0x3f; 1142 1143 err = impd_parse_ch_layout(it_bit_buff, ia_drc_params_struct, 1144 &drc_config->channel_layout); 1145 if (err) return (err); 1146 1147 for (i = 0; i < drc_config->dwnmix_instructions_count; i++) { 1148 err = impd_parse_dwnmix_instructions( 1149 it_bit_buff, version, ia_drc_params_struct, &drc_config->channel_layout, 1150 &(drc_config->dwnmix_instructions[i])); 1151 if (err) return (err); 1152 } 1153 for (i = 0; i < drc_config->drc_coefficients_basic_count; i++) { 1154 temp = impd_read_bits_buf(it_bit_buff, 11); 1155 if (it_bit_buff->error) return it_bit_buff->error; 1156 1157 drc_config->str_drc_coefficients_basic[i].drc_location = (temp >> 7) & 0xf; 1158 drc_config->str_drc_coefficients_basic[i].drc_characteristic = temp & 0x3f; 1159 } 1160 for (i = 0; i < drc_config->drc_instructions_basic_count; i++) { 1161 err = impd_drc_parse_instructions_basic( 1162 it_bit_buff, &(drc_config->str_drc_instructions_basic[i])); 1163 if (err) return (err); 1164 } 1165 for (i = 0; i < drc_config->drc_coefficients_drc_count; i++) { 1166 err = impd_drc_parse_coeff( 1167 it_bit_buff, version, ia_drc_params_struct, 1168 &(drc_config->str_p_loc_drc_coefficients_uni_drc[i])); 1169 if (err) return (err); 1170 } 1171 for (i = 0; i < drc_config->drc_instructions_uni_drc_count; i++) { 1172 err = impd_parse_drc_instructions_uni_drc( 1173 it_bit_buff, version, drc_config, 1174 &(drc_config->str_drc_instruction_str[i])); 1175 if (err) return (err); 1176 } 1177 1178 drc_config->drc_config_ext_present = impd_read_bits_buf(it_bit_buff, 1); 1179 if (it_bit_buff->error) return it_bit_buff->error; 1180 1181 if (drc_config->drc_config_ext_present == 1) { 1182 err = 1183 impd_parse_drc_config_ext(it_bit_buff, ia_drc_params_struct, drc_config, 1184 &(drc_config->str_drc_config_ext)); 1185 if (err) return (err); 1186 } 1187 1188 if (drc_config->str_drc_config_ext.parametric_drc_present) { 1189 err = impd_parametric_drc_gen_virtual_gain_sets(drc_config); 1190 if (err) return (err); 1191 } 1192 1193 for (i = 0; i < drc_config->drc_instructions_uni_drc_count; i++) { 1194 err = impd_drc_gen_instructions_derived_data( 1195 drc_config, ia_drc_params_struct, 1196 &(drc_config->str_drc_instruction_str[i])); 1197 if (err) return (err); 1198 } 1199 1200 impd_drc_gen_instructions_for_drc_off(drc_config); 1201 return (0); 1202 } 1203 1204 WORD32 1205 impd_dec_method_value(ia_bit_buf_struct* it_bit_buff, WORD32 method_def, 1206 FLOAT32* method_val) { 1207 // WORD32 err = 0; 1208 WORD32 tmp; 1209 FLOAT32 val; 1210 switch (method_def) { 1211 case METHOD_DEFINITION_UNKNOWN_OTHER: 1212 case METHOD_DEFINITION_PROGRAM_LOUDNESS: 1213 case METHOD_DEFINITION_ANCHOR_LOUDNESS: 1214 case METHOD_DEFINITION_MAX_OF_LOUDNESS_RANGE: 1215 case METHOD_DEFINITION_MOMENTARY_LOUDNESS_MAX: 1216 case METHOD_DEFINITION_SHORT_TERM_LOUDNESS_MAX: 1217 tmp = impd_read_bits_buf(it_bit_buff, 8); 1218 if (it_bit_buff->error) return it_bit_buff->error; 1219 val = -57.75f + tmp * 0.25f; 1220 break; 1221 case METHOD_DEFINITION_LOUDNESS_RANGE: 1222 tmp = impd_read_bits_buf(it_bit_buff, 8); 1223 if (it_bit_buff->error) return it_bit_buff->error; 1224 if (tmp == 0) 1225 val = 0.0f; 1226 else if (tmp <= 128) 1227 val = tmp * 0.25f; 1228 else if (tmp <= 204) 1229 val = 0.5f * tmp - 32.0f; 1230 else 1231 val = tmp - 134.0f; 1232 break; 1233 case METHOD_DEFINITION_MIXING_LEVEL: 1234 tmp = impd_read_bits_buf(it_bit_buff, 5); 1235 if (it_bit_buff->error) return it_bit_buff->error; 1236 val = tmp + 80.0f; 1237 break; 1238 case METHOD_DEFINITION_ROOM_TYPE: 1239 tmp = impd_read_bits_buf(it_bit_buff, 2); 1240 if (it_bit_buff->error) return it_bit_buff->error; 1241 val = (FLOAT32)tmp; 1242 break; 1243 case METHOD_DEFINITION_SHORT_TERM_LOUDNESS: 1244 tmp = impd_read_bits_buf(it_bit_buff, 8); 1245 if (it_bit_buff->error) return it_bit_buff->error; 1246 val = -116.f + tmp * 0.5f; 1247 break; 1248 default: 1249 return -1; 1250 break; 1251 } 1252 *method_val = val; 1253 return 0; 1254 } 1255 1256 WORD32 1257 impd_parse_loudness_info_set( 1258 ia_bit_buf_struct* it_bit_buff, 1259 ia_drc_loudness_info_set_struct* loudness_info_set) { 1260 WORD32 err = 0, i, version = 0, offset, temp; 1261 WORD32 loudness_info_album_count, loudness_info_count; 1262 1263 temp = impd_read_bits_buf(it_bit_buff, 12); 1264 if (it_bit_buff->error) return it_bit_buff->error; 1265 1266 loudness_info_album_count = (temp >> 6) & 0x3f; 1267 loudness_info_count = temp & 0x3f; 1268 1269 offset = loudness_info_set->loudness_info_album_count; 1270 loudness_info_set->loudness_info_album_count += loudness_info_album_count; 1271 for (i = 0; i < loudness_info_set->loudness_info_album_count; i++) { 1272 err = impd_parse_loudness_info( 1273 it_bit_buff, version, 1274 &(loudness_info_set->str_loudness_info_album[i + offset])); 1275 if (err) return (err); 1276 } 1277 1278 offset = loudness_info_set->loudness_info_count; 1279 loudness_info_set->loudness_info_count += loudness_info_count; 1280 for (i = 0; i < loudness_info_set->loudness_info_count; i++) { 1281 err = impd_parse_loudness_info( 1282 it_bit_buff, version, &(loudness_info_set->loudness_info[i + offset])); 1283 if (err) return (err); 1284 } 1285 1286 loudness_info_set->loudness_info_set_ext_present = 1287 impd_read_bits_buf(it_bit_buff, 1); 1288 if (it_bit_buff->error) return it_bit_buff->error; 1289 1290 if (loudness_info_set->loudness_info_set_ext_present == 1) { 1291 err = impd_parse_loudness_info_set_ext(it_bit_buff, loudness_info_set); 1292 if (err) return (err); 1293 } 1294 1295 return (0); 1296 } 1297 1298 WORD32 1299 impd_parse_gain_set_params_characteristics(ia_bit_buf_struct* it_bit_buff, 1300 WORD32 version, 1301 ia_gain_params_struct* gain_params) { 1302 // WORD32 err = 0; 1303 WORD32 temp; 1304 if (version == 0) { 1305 gain_params->drc_characteristic = impd_read_bits_buf(it_bit_buff, 7); 1306 if (it_bit_buff->error) return it_bit_buff->error; 1307 if (gain_params->drc_characteristic > 0) { 1308 gain_params->drc_characteristic_present = 1; 1309 gain_params->drc_characteristic_format_is_cicp = 1; 1310 } else { 1311 gain_params->drc_characteristic_present = 0; 1312 } 1313 } else { 1314 gain_params->drc_characteristic_present = 1315 impd_read_bits_buf(it_bit_buff, 1); 1316 if (it_bit_buff->error) return it_bit_buff->error; 1317 if (gain_params->drc_characteristic_present) { 1318 gain_params->drc_characteristic_format_is_cicp = 1319 impd_read_bits_buf(it_bit_buff, 1); 1320 if (it_bit_buff->error) return it_bit_buff->error; 1321 if (gain_params->drc_characteristic_format_is_cicp) { 1322 gain_params->drc_characteristic = impd_read_bits_buf(it_bit_buff, 7); 1323 if (it_bit_buff->error) return it_bit_buff->error; 1324 } else { 1325 temp = impd_read_bits_buf(it_bit_buff, 8); 1326 if (it_bit_buff->error) return it_bit_buff->error; 1327 1328 gain_params->drc_characteristic_left_index = (temp >> 4) & 0xf; 1329 gain_params->drc_characteristic_right_index = temp & 0xf; 1330 } 1331 } 1332 } 1333 return (0); 1334 } 1335 1336 WORD32 1337 impd_parse_loudness_measure(ia_bit_buf_struct* it_bit_buff, 1338 ia_loudness_measure_struct* loudness_measure) { 1339 WORD32 err = 0, temp; 1340 1341 loudness_measure->method_def = impd_read_bits_buf(it_bit_buff, 4); 1342 if (it_bit_buff->error) return it_bit_buff->error; 1343 1344 err = impd_dec_method_value(it_bit_buff, loudness_measure->method_def, 1345 &(loudness_measure->method_val)); 1346 if (err) return err; 1347 1348 temp = impd_read_bits_buf(it_bit_buff, 6); 1349 if (it_bit_buff->error) return it_bit_buff->error; 1350 1351 loudness_measure->measurement_system = (temp >> 2) & 0xf; 1352 loudness_measure->reliability = temp & 3; 1353 1354 return (0); 1355 } 1356 1357 WORD32 1358 impd_dec_gain_modifiers(ia_bit_buf_struct* it_bit_buff, WORD32 version, 1359 WORD32 band_count, 1360 ia_gain_modifiers_struct* pstr_gain_modifiers) { 1361 // WORD32 err = 0; 1362 WORD32 sign, temp; 1363 1364 if (version > 0) { 1365 WORD32 b; 1366 for (b = 0; b < band_count; b++) { 1367 pstr_gain_modifiers->target_characteristic_left_present[b] = 1368 impd_read_bits_buf(it_bit_buff, 1); 1369 if (it_bit_buff->error) return it_bit_buff->error; 1370 if (pstr_gain_modifiers->target_characteristic_left_present[b]) { 1371 pstr_gain_modifiers->target_characteristic_left_index[b] = 1372 impd_read_bits_buf(it_bit_buff, 4); 1373 if (it_bit_buff->error) return it_bit_buff->error; 1374 } 1375 pstr_gain_modifiers->target_characteristic_right_present[b] = 1376 impd_read_bits_buf(it_bit_buff, 1); 1377 if (it_bit_buff->error) return it_bit_buff->error; 1378 if (pstr_gain_modifiers->target_characteristic_right_present[b]) { 1379 pstr_gain_modifiers->target_characteristic_right_index[b] = 1380 impd_read_bits_buf(it_bit_buff, 4); 1381 if (it_bit_buff->error) return it_bit_buff->error; 1382 } 1383 pstr_gain_modifiers->gain_scaling_flag[b] = 1384 impd_read_bits_buf(it_bit_buff, 1); 1385 if (it_bit_buff->error) return it_bit_buff->error; 1386 if (pstr_gain_modifiers->gain_scaling_flag[b]) { 1387 temp = impd_read_bits_buf(it_bit_buff, 8); 1388 if (it_bit_buff->error) return it_bit_buff->error; 1389 1390 pstr_gain_modifiers->attn_scaling[b] = ((temp >> 4) & 0xf) * 0.125f; 1391 pstr_gain_modifiers->ampl_scaling[b] = (temp & 0xf) * 0.125f; 1392 } 1393 1394 pstr_gain_modifiers->gain_offset_flag[b] = 1395 impd_read_bits_buf(it_bit_buff, 1); 1396 if (it_bit_buff->error) return it_bit_buff->error; 1397 if (pstr_gain_modifiers->gain_offset_flag[b]) { 1398 FLOAT32 gain_offset; 1399 temp = impd_read_bits_buf(it_bit_buff, 6); 1400 if (it_bit_buff->error) return it_bit_buff->error; 1401 1402 sign = ((temp >> 5) & 1); 1403 gain_offset = (1 + (temp & 0x1f)) * 0.25f; 1404 1405 if (sign) { 1406 gain_offset = -gain_offset; 1407 } 1408 pstr_gain_modifiers->gain_offset[b] = gain_offset; 1409 } 1410 } 1411 if (band_count == 1) { 1412 pstr_gain_modifiers->shape_filter_flag = 1413 impd_read_bits_buf(it_bit_buff, 1); 1414 if (it_bit_buff->error) return it_bit_buff->error; 1415 if (pstr_gain_modifiers->shape_filter_flag) { 1416 pstr_gain_modifiers->shape_filter_idx = 1417 impd_read_bits_buf(it_bit_buff, 4); 1418 if (it_bit_buff->error) return it_bit_buff->error; 1419 } 1420 } 1421 } else if (version == 0) { 1422 WORD32 b, gain_scaling_flag, gain_offset_flag; 1423 FLOAT32 attn_scaling = 1.0f, ampl_scaling = 1.0f, gain_offset = 0.0f; 1424 1425 gain_scaling_flag = impd_read_bits_buf(it_bit_buff, 1); 1426 if (it_bit_buff->error) return it_bit_buff->error; 1427 if (gain_scaling_flag) { 1428 temp = impd_read_bits_buf(it_bit_buff, 8); 1429 if (it_bit_buff->error) return it_bit_buff->error; 1430 1431 attn_scaling = ((temp >> 4) & 0xf) * 0.125f; 1432 ampl_scaling = (temp & 0xf) * 0.125f; 1433 } 1434 1435 gain_offset_flag = impd_read_bits_buf(it_bit_buff, 1); 1436 if (it_bit_buff->error) return it_bit_buff->error; 1437 if (gain_offset_flag) { 1438 temp = impd_read_bits_buf(it_bit_buff, 6); 1439 if (it_bit_buff->error) return it_bit_buff->error; 1440 1441 sign = ((temp >> 5) & 1); 1442 gain_offset = (1 + (temp & 0x1f)) * 0.25f; 1443 1444 if (sign) { 1445 gain_offset = -gain_offset; 1446 } 1447 } 1448 for (b = 0; b < band_count; b++) { 1449 pstr_gain_modifiers->target_characteristic_left_present[b] = 0; 1450 pstr_gain_modifiers->target_characteristic_right_present[b] = 0; 1451 pstr_gain_modifiers->gain_scaling_flag[b] = gain_scaling_flag; 1452 pstr_gain_modifiers->attn_scaling[b] = attn_scaling; 1453 pstr_gain_modifiers->ampl_scaling[b] = ampl_scaling; 1454 pstr_gain_modifiers->gain_offset_flag[b] = gain_offset_flag; 1455 pstr_gain_modifiers->gain_offset[b] = gain_offset; 1456 } 1457 pstr_gain_modifiers->shape_filter_flag = 0; 1458 } 1459 return (0); 1460 } 1461 1462 WORD32 1463 impd_parse_gain_set_params(ia_bit_buf_struct* it_bit_buff, WORD32 version, 1464 WORD32* gain_seq_idx, 1465 ia_gain_set_params_struct* gain_set_params) { 1466 WORD32 err = 0, i, temp; 1467 1468 temp = impd_read_bits_buf(it_bit_buff, 6); 1469 if (it_bit_buff->error) return it_bit_buff->error; 1470 1471 gain_set_params->gain_coding_profile = (temp >> 4) & 3; 1472 gain_set_params->gain_interpolation_type = (temp >> 3) & 1; 1473 gain_set_params->full_frame = (temp >> 2) & 1; 1474 gain_set_params->time_alignment = (temp >> 1) & 1; 1475 gain_set_params->time_delt_min_flag = temp & 1; 1476 1477 if (gain_set_params->time_delt_min_flag) { 1478 WORD32 time_delta_min; 1479 time_delta_min = impd_read_bits_buf(it_bit_buff, 11); 1480 if (it_bit_buff->error) return it_bit_buff->error; 1481 gain_set_params->time_delt_min_val = time_delta_min + 1; 1482 } 1483 1484 if (gain_set_params->gain_coding_profile == GAIN_CODING_PROFILE_CONSTANT) { 1485 gain_set_params->band_count = 1; 1486 *gain_seq_idx = (*gain_seq_idx) + 1; 1487 } else { 1488 gain_set_params->band_count = impd_read_bits_buf(it_bit_buff, 4); 1489 if (it_bit_buff->error) return it_bit_buff->error; 1490 1491 if (gain_set_params->band_count > 1) { 1492 gain_set_params->drc_band_type = impd_read_bits_buf(it_bit_buff, 1); 1493 if (it_bit_buff->error) return it_bit_buff->error; 1494 } 1495 for (i = 0; i < gain_set_params->band_count; i++) { 1496 if (version == 0) { 1497 *gain_seq_idx = (*gain_seq_idx) + 1; 1498 } else { 1499 WORD32 indexPresent; 1500 indexPresent = impd_read_bits_buf(it_bit_buff, 1); 1501 if (it_bit_buff->error) return it_bit_buff->error; 1502 if (indexPresent) { 1503 WORD32 bsIndex; 1504 bsIndex = impd_read_bits_buf(it_bit_buff, 6); 1505 if (it_bit_buff->error) return it_bit_buff->error; 1506 *gain_seq_idx = bsIndex; 1507 } else { 1508 *gain_seq_idx = (*gain_seq_idx) + 1; 1509 } 1510 } 1511 gain_set_params->gain_params[i].gain_seq_idx = *gain_seq_idx; 1512 err = impd_parse_gain_set_params_characteristics( 1513 it_bit_buff, version, &(gain_set_params->gain_params[i])); 1514 if (err) return (err); 1515 } 1516 if (gain_set_params->drc_band_type) { 1517 for (i = 1; i < gain_set_params->band_count; i++) { 1518 gain_set_params->gain_params[i].crossover_freq_idx = 1519 impd_read_bits_buf(it_bit_buff, 4); 1520 if (it_bit_buff->error) return it_bit_buff->error; 1521 } 1522 } else { 1523 for (i = 1; i < gain_set_params->band_count; i++) { 1524 gain_set_params->gain_params[i].start_subband_index = 1525 impd_read_bits_buf(it_bit_buff, 10); 1526 if (it_bit_buff->error) return it_bit_buff->error; 1527 } 1528 } 1529 } 1530 1531 return (0); 1532 } 1533 1534 WORD32 1535 impd_sel_drc_coeff( 1536 ia_drc_config* drc_config, WORD32 location, 1537 ia_uni_drc_coeffs_struct** str_p_loc_drc_coefficients_uni_drc) { 1538 WORD32 n; 1539 WORD32 c1 = -1; 1540 WORD32 c0 = -1; 1541 for (n = 0; n < drc_config->drc_coefficients_drc_count; n++) { 1542 if (drc_config->str_p_loc_drc_coefficients_uni_drc[n].drc_location == 1543 location) { 1544 if (drc_config->str_p_loc_drc_coefficients_uni_drc[n].version == 0) { 1545 c0 = n; 1546 } else { 1547 c1 = n; 1548 } 1549 } 1550 } 1551 if (c1 >= 0) { 1552 *str_p_loc_drc_coefficients_uni_drc = 1553 &(drc_config->str_p_loc_drc_coefficients_uni_drc[c1]); 1554 } else if (c0 >= 0) { 1555 *str_p_loc_drc_coefficients_uni_drc = 1556 &(drc_config->str_p_loc_drc_coefficients_uni_drc[c0]); 1557 } else { 1558 *str_p_loc_drc_coefficients_uni_drc = NULL; 1559 } 1560 return (0); 1561 } 1562 1563 WORD32 1564 impd_parse_loudness_info_set_ext( 1565 ia_bit_buf_struct* it_bit_buff, 1566 ia_drc_loudness_info_set_struct* loudness_info_set) { 1567 WORD32 err = 0, i, k; 1568 WORD32 bit_size_len, ext_size_bits, bit_size, other_bit; 1569 1570 k = 0; 1571 loudness_info_set->str_loudness_info_set_ext.loudness_info_set_ext_type[k] = 1572 impd_read_bits_buf(it_bit_buff, 4); 1573 if (it_bit_buff->error) return it_bit_buff->error; 1574 while (loudness_info_set->str_loudness_info_set_ext 1575 .loudness_info_set_ext_type[k] != UNIDRCLOUDEXT_TERM) { 1576 bit_size_len = impd_read_bits_buf(it_bit_buff, 4); 1577 if (it_bit_buff->error) return it_bit_buff->error; 1578 ext_size_bits = bit_size_len + 4; 1579 1580 bit_size = impd_read_bits_buf(it_bit_buff, ext_size_bits); 1581 if (it_bit_buff->error) return it_bit_buff->error; 1582 loudness_info_set->str_loudness_info_set_ext.ext_bit_size[k] = bit_size + 1; 1583 1584 switch (loudness_info_set->str_loudness_info_set_ext 1585 .loudness_info_set_ext_type[k]) { 1586 case UNIDRCLOUDEXT_EQ: 1587 err = impd_parse_loud_info_set_ext_eq(it_bit_buff, loudness_info_set); 1588 if (err) return (err); 1589 break; 1590 default: 1591 for (i = 0; 1592 i < loudness_info_set->str_loudness_info_set_ext.ext_bit_size[k]; 1593 i++) { 1594 other_bit = impd_read_bits_buf(it_bit_buff, 1); 1595 if (it_bit_buff->error) return it_bit_buff->error; 1596 } 1597 break; 1598 } 1599 k++; 1600 loudness_info_set->str_loudness_info_set_ext.loudness_info_set_ext_type[k] = 1601 impd_read_bits_buf(it_bit_buff, 4); 1602 if (it_bit_buff->error) return it_bit_buff->error; 1603 } 1604 1605 return (0); 1606 } 1607 1608 WORD32 1609 impd_drc_parse_coeff( 1610 ia_bit_buf_struct* it_bit_buff, WORD32 version, 1611 ia_drc_params_bs_dec_struct* ia_drc_params_struct, 1612 ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc) { 1613 WORD32 err = 0, i, drc_frame_size, temp; 1614 WORD32 gain_seq_idx = -1; 1615 1616 str_p_loc_drc_coefficients_uni_drc->version = version; 1617 if (version == 0) { 1618 WORD32 gain_sequence_count = 0; 1619 temp = impd_read_bits_buf(it_bit_buff, 5); 1620 if (it_bit_buff->error) return it_bit_buff->error; 1621 1622 str_p_loc_drc_coefficients_uni_drc->drc_location = (temp >> 1) & 0xf; 1623 str_p_loc_drc_coefficients_uni_drc->drc_frame_size_present = temp & 1; 1624 1625 if (str_p_loc_drc_coefficients_uni_drc->drc_frame_size_present == 1) { 1626 drc_frame_size = impd_read_bits_buf(it_bit_buff, 15); 1627 if (it_bit_buff->error) return it_bit_buff->error; 1628 str_p_loc_drc_coefficients_uni_drc->drc_frame_size = drc_frame_size + 1; 1629 } 1630 1631 str_p_loc_drc_coefficients_uni_drc->drc_characteristic_left_present = 0; 1632 str_p_loc_drc_coefficients_uni_drc->drc_characteristic_right_present = 0; 1633 str_p_loc_drc_coefficients_uni_drc->shape_filters_present = 0; 1634 str_p_loc_drc_coefficients_uni_drc->gain_set_count = 1635 impd_read_bits_buf(it_bit_buff, 6); 1636 if (it_bit_buff->error) return it_bit_buff->error; 1637 str_p_loc_drc_coefficients_uni_drc->gain_set_count_plus = 1638 str_p_loc_drc_coefficients_uni_drc->gain_set_count; 1639 for (i = 0; i < str_p_loc_drc_coefficients_uni_drc->gain_set_count; i++) { 1640 err = impd_parse_gain_set_params( 1641 it_bit_buff, version, &gain_seq_idx, 1642 &(str_p_loc_drc_coefficients_uni_drc->gain_set_params[i])); 1643 if (err) return (err); 1644 1645 if (str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 1646 .time_delt_min_flag) { 1647 if (str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 1648 .time_delt_min_val > ia_drc_params_struct->drc_frame_size) { 1649 /* drc time interval too big */ 1650 return (PARAM_ERROR); 1651 } 1652 str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 1653 .num_gain_max_values = 1654 ia_drc_params_struct->drc_frame_size / 1655 str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 1656 .time_delt_min_val; 1657 err = impd_init_tbls( 1658 str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 1659 .num_gain_max_values, 1660 &(str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 1661 .str_tables)); 1662 if (err) return (err); 1663 } 1664 gain_sequence_count += 1665 str_p_loc_drc_coefficients_uni_drc->gain_set_params[i].band_count; 1666 } 1667 str_p_loc_drc_coefficients_uni_drc->gain_sequence_count = 1668 gain_sequence_count; 1669 } else { 1670 ia_shape_filter_block_params_struct* pstr_shape_filter_block_params; 1671 for (i = 0; i < SEQUENCE_COUNT_MAX; i++) { 1672 str_p_loc_drc_coefficients_uni_drc 1673 ->gain_set_params_index_for_gain_sequence[i] = -1; 1674 } 1675 1676 temp = impd_read_bits_buf(it_bit_buff, 5); 1677 if (it_bit_buff->error) return it_bit_buff->error; 1678 1679 str_p_loc_drc_coefficients_uni_drc->drc_location = (temp >> 1) & 0xf; 1680 str_p_loc_drc_coefficients_uni_drc->drc_frame_size_present = temp & 1; 1681 1682 if (str_p_loc_drc_coefficients_uni_drc->drc_frame_size_present == 1) { 1683 drc_frame_size = impd_read_bits_buf(it_bit_buff, 15); 1684 if (it_bit_buff->error) return it_bit_buff->error; 1685 str_p_loc_drc_coefficients_uni_drc->drc_frame_size = drc_frame_size + 1; 1686 } 1687 str_p_loc_drc_coefficients_uni_drc->drc_characteristic_left_present = 1688 impd_read_bits_buf(it_bit_buff, 1); 1689 if (it_bit_buff->error) return it_bit_buff->error; 1690 if (str_p_loc_drc_coefficients_uni_drc->drc_characteristic_left_present == 1691 1) { 1692 str_p_loc_drc_coefficients_uni_drc->characteristic_left_count = 1693 impd_read_bits_buf(it_bit_buff, 4); 1694 if (it_bit_buff->error) return it_bit_buff->error; 1695 for (i = 1; 1696 i <= str_p_loc_drc_coefficients_uni_drc->characteristic_left_count; 1697 i++) { 1698 err = impd_parse_split_drc_characteristic( 1699 it_bit_buff, LEFT_SIDE, &(str_p_loc_drc_coefficients_uni_drc 1700 ->str_split_characteristic_left[i])); 1701 if (err) return (err); 1702 } 1703 } 1704 str_p_loc_drc_coefficients_uni_drc->drc_characteristic_right_present = 1705 impd_read_bits_buf(it_bit_buff, 1); 1706 if (it_bit_buff->error) return it_bit_buff->error; 1707 if (str_p_loc_drc_coefficients_uni_drc->drc_characteristic_right_present == 1708 1) { 1709 str_p_loc_drc_coefficients_uni_drc->characteristic_right_count = 1710 impd_read_bits_buf(it_bit_buff, 4); 1711 if (it_bit_buff->error) return it_bit_buff->error; 1712 for (i = 1; 1713 i <= str_p_loc_drc_coefficients_uni_drc->characteristic_right_count; 1714 i++) { 1715 err = impd_parse_split_drc_characteristic( 1716 it_bit_buff, RIGHT_SIDE, 1717 &(str_p_loc_drc_coefficients_uni_drc 1718 ->str_split_characteristic_right[i])); 1719 if (err) return (err); 1720 } 1721 } 1722 str_p_loc_drc_coefficients_uni_drc->shape_filters_present = 1723 impd_read_bits_buf(it_bit_buff, 1); 1724 if (it_bit_buff->error) return it_bit_buff->error; 1725 if (str_p_loc_drc_coefficients_uni_drc->shape_filters_present == 1) { 1726 str_p_loc_drc_coefficients_uni_drc->shape_num_filter = 1727 impd_read_bits_buf(it_bit_buff, 4); 1728 if (it_bit_buff->error) return it_bit_buff->error; 1729 for (i = 1; i <= str_p_loc_drc_coefficients_uni_drc->shape_num_filter; 1730 i++) { 1731 pstr_shape_filter_block_params = 1732 &(str_p_loc_drc_coefficients_uni_drc 1733 ->str_shape_filter_block_params[i]); 1734 pstr_shape_filter_block_params->lf_cut_filter_present = 1735 impd_read_bits_buf(it_bit_buff, 1); 1736 if (it_bit_buff->error) return it_bit_buff->error; 1737 1738 if (pstr_shape_filter_block_params->lf_cut_filter_present == 1) { 1739 temp = impd_read_bits_buf(it_bit_buff, 5); 1740 if (it_bit_buff->error) return it_bit_buff->error; 1741 1742 pstr_shape_filter_block_params->str_lf_cut_params.corner_freq_index = 1743 (temp >> 2) & 7; 1744 pstr_shape_filter_block_params->str_lf_cut_params 1745 .filter_strength_index = temp & 3; 1746 } 1747 pstr_shape_filter_block_params->lf_boost_filter_present = 1748 impd_read_bits_buf(it_bit_buff, 1); 1749 if (it_bit_buff->error) return it_bit_buff->error; 1750 if (pstr_shape_filter_block_params->lf_boost_filter_present == 1) { 1751 temp = impd_read_bits_buf(it_bit_buff, 5); 1752 if (it_bit_buff->error) return it_bit_buff->error; 1753 1754 pstr_shape_filter_block_params->str_lf_boost_params 1755 .corner_freq_index = (temp >> 2) & 7; 1756 pstr_shape_filter_block_params->str_lf_boost_params 1757 .filter_strength_index = temp & 3; 1758 } 1759 pstr_shape_filter_block_params->hf_cut_filter_present = 1760 impd_read_bits_buf(it_bit_buff, 1); 1761 if (it_bit_buff->error) return it_bit_buff->error; 1762 if (pstr_shape_filter_block_params->hf_cut_filter_present == 1) { 1763 temp = impd_read_bits_buf(it_bit_buff, 5); 1764 if (it_bit_buff->error) return it_bit_buff->error; 1765 1766 pstr_shape_filter_block_params->str_hfCutParams.corner_freq_index = 1767 (temp >> 2) & 7; 1768 pstr_shape_filter_block_params->str_hfCutParams 1769 .filter_strength_index = temp & 3; 1770 } 1771 pstr_shape_filter_block_params->hf_boost_filter_present = 1772 impd_read_bits_buf(it_bit_buff, 1); 1773 if (it_bit_buff->error) return it_bit_buff->error; 1774 if (pstr_shape_filter_block_params->hf_boost_filter_present == 1) { 1775 temp = impd_read_bits_buf(it_bit_buff, 5); 1776 if (it_bit_buff->error) return it_bit_buff->error; 1777 1778 pstr_shape_filter_block_params->str_hf_boost_params 1779 .corner_freq_index = (temp >> 2) & 7; 1780 pstr_shape_filter_block_params->str_hf_boost_params 1781 .filter_strength_index = temp & 3; 1782 } 1783 } 1784 } 1785 1786 temp = impd_read_bits_buf(it_bit_buff, 12); 1787 if (it_bit_buff->error) return it_bit_buff->error; 1788 1789 str_p_loc_drc_coefficients_uni_drc->gain_sequence_count = 1790 (temp >> 6) & 0x3f; 1791 str_p_loc_drc_coefficients_uni_drc->gain_set_count = temp & 0x3f; 1792 1793 str_p_loc_drc_coefficients_uni_drc->gain_set_count_plus = 1794 str_p_loc_drc_coefficients_uni_drc->gain_set_count; 1795 for (i = 0; i < str_p_loc_drc_coefficients_uni_drc->gain_set_count; i++) { 1796 err = impd_parse_gain_set_params( 1797 it_bit_buff, version, &gain_seq_idx, 1798 &(str_p_loc_drc_coefficients_uni_drc->gain_set_params[i])); 1799 if (err) return (err); 1800 1801 if (str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 1802 .time_delt_min_flag) { 1803 if (str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 1804 .time_delt_min_val > ia_drc_params_struct->drc_frame_size) { 1805 /* drc time interval too big */ 1806 return (PARAM_ERROR); 1807 } 1808 str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 1809 .num_gain_max_values = 1810 ia_drc_params_struct->drc_frame_size / 1811 str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 1812 .time_delt_min_val; 1813 err = impd_init_tbls( 1814 str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 1815 .num_gain_max_values, 1816 &(str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 1817 .str_tables)); 1818 if (err) return (err); 1819 } 1820 } 1821 1822 for (i = 0; i < str_p_loc_drc_coefficients_uni_drc->gain_set_count; i++) { 1823 WORD32 b; 1824 for (b = 0; 1825 b < 1826 str_p_loc_drc_coefficients_uni_drc->gain_set_params[i].band_count; 1827 b++) { 1828 str_p_loc_drc_coefficients_uni_drc 1829 ->gain_set_params_index_for_gain_sequence 1830 [str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] 1831 .gain_params[b] 1832 .gain_seq_idx] = i; 1833 } 1834 } 1835 } 1836 return (0); 1837 } 1838 1839 WORD32 1840 impd_drc_parse_instructions_basic( 1841 ia_bit_buf_struct* it_bit_buff, 1842 ia_drc_instructions_basic_struct* str_drc_instructions_basic) { 1843 // WORD32 err = 0; 1844 WORD32 i, limiter_peak_target, temp; 1845 WORD32 additional_dmix_id_present, additional_dmix_id_cnt; 1846 1847 temp = impd_read_bits_buf(it_bit_buff, 18); 1848 if (it_bit_buff->error) return it_bit_buff->error; 1849 1850 str_drc_instructions_basic->drc_set_id = (temp >> 12) & 0x3f; 1851 str_drc_instructions_basic->drc_location = (temp >> 8) & 0xf; 1852 str_drc_instructions_basic->downmix_id[0] = (temp >> 1) & 0x7f; 1853 additional_dmix_id_present = temp & 1; 1854 str_drc_instructions_basic->dwnmix_id_count = 1; 1855 1856 if (additional_dmix_id_present) { 1857 additional_dmix_id_cnt = impd_read_bits_buf(it_bit_buff, 3); 1858 if (it_bit_buff->error) return it_bit_buff->error; 1859 for (i = 0; i < additional_dmix_id_cnt; i++) { 1860 str_drc_instructions_basic->downmix_id[i + 1] = 1861 impd_read_bits_buf(it_bit_buff, 7); 1862 if (it_bit_buff->error) return it_bit_buff->error; 1863 } 1864 str_drc_instructions_basic->dwnmix_id_count = 1 + additional_dmix_id_cnt; 1865 } 1866 1867 str_drc_instructions_basic->drc_set_effect = 1868 impd_read_bits_buf(it_bit_buff, 16); 1869 if (it_bit_buff->error) return it_bit_buff->error; 1870 1871 if ((str_drc_instructions_basic->drc_set_effect & 1872 (EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) == 0) { 1873 str_drc_instructions_basic->limiter_peak_target_present = 1874 impd_read_bits_buf(it_bit_buff, 1); 1875 if (it_bit_buff->error) return it_bit_buff->error; 1876 if (str_drc_instructions_basic->limiter_peak_target_present) { 1877 limiter_peak_target = impd_read_bits_buf(it_bit_buff, 8); 1878 if (it_bit_buff->error) return it_bit_buff->error; 1879 str_drc_instructions_basic->limiter_peak_target = 1880 -limiter_peak_target * 0.125f; 1881 } 1882 } 1883 1884 str_drc_instructions_basic->drc_set_target_loudness_present = 1885 impd_read_bits_buf(it_bit_buff, 1); 1886 if (it_bit_buff->error) return it_bit_buff->error; 1887 1888 str_drc_instructions_basic->drc_set_target_loudness_value_upper = 0; 1889 str_drc_instructions_basic->drc_set_target_loudness_value_lower = -63; 1890 1891 if (str_drc_instructions_basic->drc_set_target_loudness_present == 1) { 1892 WORD32 bsDrcSetTargetLoudnessValueUpper, bsDrcSetTargetLoudnessValueLower; 1893 bsDrcSetTargetLoudnessValueUpper = impd_read_bits_buf(it_bit_buff, 6); 1894 if (it_bit_buff->error) return it_bit_buff->error; 1895 str_drc_instructions_basic->drc_set_target_loudness_value_upper = 1896 bsDrcSetTargetLoudnessValueUpper - 63; 1897 1898 str_drc_instructions_basic->drc_set_target_loudness_value_lower_present = 1899 impd_read_bits_buf(it_bit_buff, 1); 1900 if (it_bit_buff->error) return it_bit_buff->error; 1901 1902 if (str_drc_instructions_basic 1903 ->drc_set_target_loudness_value_lower_present == 1) { 1904 bsDrcSetTargetLoudnessValueLower = impd_read_bits_buf(it_bit_buff, 6); 1905 if (it_bit_buff->error) return it_bit_buff->error; 1906 str_drc_instructions_basic->drc_set_target_loudness_value_lower = 1907 bsDrcSetTargetLoudnessValueLower - 63; 1908 } 1909 } 1910 1911 return (0); 1912 } 1913 1914 WORD32 1915 impd_dec_ducking_scaling(ia_bit_buf_struct* it_bit_buff, 1916 WORD32* ducking_scaling_flag, 1917 FLOAT32* p_ducking_scaling) { 1918 WORD32 ducking_scaling_present, ducking_scaling, sigma, mu; 1919 1920 ducking_scaling_present = impd_read_bits_buf(it_bit_buff, 1); 1921 if (it_bit_buff->error) return it_bit_buff->error; 1922 1923 if (ducking_scaling_present == 0) { 1924 *ducking_scaling_flag = 0; 1925 *p_ducking_scaling = 1.0f; 1926 } else { 1927 *ducking_scaling_flag = 1; 1928 ducking_scaling = impd_read_bits_buf(it_bit_buff, 4); 1929 if (it_bit_buff->error) return it_bit_buff->error; 1930 1931 sigma = ducking_scaling >> 3; 1932 mu = ducking_scaling & 0x7; 1933 1934 if (sigma == 0) { 1935 *p_ducking_scaling = 1.0f + 0.125f * (1.0f + mu); 1936 } else { 1937 *p_ducking_scaling = 1.0f - 0.125f * (1.0f + mu); 1938 } 1939 } 1940 return (0); 1941 } 1942 1943 WORD32 1944 impd_parse_drc_instructions_uni_drc( 1945 ia_bit_buf_struct* it_bit_buff, WORD32 version, ia_drc_config* drc_config, 1946 ia_drc_instructions_struct* str_drc_instruction_str) { 1947 WORD32 err = 0, i, n, k, g, c, limiter_peak_target, idx; 1948 WORD32 additional_dmix_id_present, additional_dmix_id_cnt; 1949 ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc = NULL; 1950 WORD32 ch_cnt; 1951 WORD32 unique_idx[MAX_CHANNEL_COUNT]; 1952 FLOAT32 unique_scaling[MAX_CHANNEL_COUNT]; 1953 WORD32 match; 1954 WORD32 dmix_id_present; 1955 WORD32 repeat_parameters, repeat_parameters_cnt; 1956 WORD32 ducking_sequence; 1957 FLOAT32 factor; 1958 1959 str_drc_instruction_str->drc_set_id = impd_read_bits_buf(it_bit_buff, 6); 1960 if (it_bit_buff->error) return it_bit_buff->error; 1961 if (version == 0) { 1962 str_drc_instruction_str->drc_set_complexity_level = 1963 DRC_COMPLEXITY_LEVEL_MAX; 1964 } else { 1965 str_drc_instruction_str->drc_set_complexity_level = 1966 impd_read_bits_buf(it_bit_buff, 4); 1967 if (it_bit_buff->error) return it_bit_buff->error; 1968 } 1969 str_drc_instruction_str->drc_location = impd_read_bits_buf(it_bit_buff, 4); 1970 if (it_bit_buff->error) return it_bit_buff->error; 1971 dmix_id_present = 1; 1972 if (version >= 1) { 1973 dmix_id_present = impd_read_bits_buf(it_bit_buff, 1); 1974 if (it_bit_buff->error) return it_bit_buff->error; 1975 } 1976 if (dmix_id_present == 1) { 1977 str_drc_instruction_str->downmix_id[0] = impd_read_bits_buf(it_bit_buff, 7); 1978 if (it_bit_buff->error) return it_bit_buff->error; 1979 if (version >= 1) { 1980 str_drc_instruction_str->drc_apply_to_dwnmix = 1981 impd_read_bits_buf(it_bit_buff, 1); 1982 if (it_bit_buff->error) return it_bit_buff->error; 1983 } 1984 if (version == 0) { 1985 if (str_drc_instruction_str->downmix_id[0] == 0) { 1986 str_drc_instruction_str->drc_apply_to_dwnmix = 0; 1987 } else { 1988 str_drc_instruction_str->drc_apply_to_dwnmix = 1; 1989 } 1990 } 1991 additional_dmix_id_present = impd_read_bits_buf(it_bit_buff, 1); 1992 if (it_bit_buff->error) return it_bit_buff->error; 1993 1994 if (additional_dmix_id_present) { 1995 additional_dmix_id_cnt = impd_read_bits_buf(it_bit_buff, 3); 1996 if (it_bit_buff->error) return it_bit_buff->error; 1997 for (i = 0; i < additional_dmix_id_cnt; i++) { 1998 str_drc_instruction_str->downmix_id[i + 1] = 1999 impd_read_bits_buf(it_bit_buff, 7); 2000 if (it_bit_buff->error) return it_bit_buff->error; 2001 } 2002 str_drc_instruction_str->dwnmix_id_count = 1 + additional_dmix_id_cnt; 2003 } else { 2004 str_drc_instruction_str->dwnmix_id_count = 1; 2005 } 2006 } else { 2007 str_drc_instruction_str->downmix_id[0] = 0; 2008 str_drc_instruction_str->dwnmix_id_count = 1; 2009 } 2010 2011 str_drc_instruction_str->drc_set_effect = impd_read_bits_buf(it_bit_buff, 16); 2012 if (it_bit_buff->error) return it_bit_buff->error; 2013 2014 if ((str_drc_instruction_str->drc_set_effect & 2015 (EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) == 0) { 2016 str_drc_instruction_str->limiter_peak_target_present = 2017 impd_read_bits_buf(it_bit_buff, 1); 2018 if (it_bit_buff->error) return it_bit_buff->error; 2019 if (str_drc_instruction_str->limiter_peak_target_present) { 2020 limiter_peak_target = impd_read_bits_buf(it_bit_buff, 8); 2021 if (it_bit_buff->error) return it_bit_buff->error; 2022 str_drc_instruction_str->limiter_peak_target = 2023 -limiter_peak_target * 0.125f; 2024 } 2025 } 2026 2027 str_drc_instruction_str->drc_set_target_loudness_present = 2028 impd_read_bits_buf(it_bit_buff, 1); 2029 if (it_bit_buff->error) return it_bit_buff->error; 2030 2031 str_drc_instruction_str->drc_set_target_loudness_value_upper = 0; 2032 str_drc_instruction_str->drc_set_target_loudness_value_lower = -63; 2033 2034 if (str_drc_instruction_str->drc_set_target_loudness_present == 1) { 2035 WORD32 bsDrcSetTargetLoudnessValueUpper, bsDrcSetTargetLoudnessValueLower; 2036 bsDrcSetTargetLoudnessValueUpper = impd_read_bits_buf(it_bit_buff, 6); 2037 if (it_bit_buff->error) return it_bit_buff->error; 2038 str_drc_instruction_str->drc_set_target_loudness_value_upper = 2039 bsDrcSetTargetLoudnessValueUpper - 63; 2040 str_drc_instruction_str->drc_set_target_loudness_value_lower_present = 2041 impd_read_bits_buf(it_bit_buff, 1); 2042 if (it_bit_buff->error) return it_bit_buff->error; 2043 if (str_drc_instruction_str->drc_set_target_loudness_value_lower_present == 2044 1) { 2045 bsDrcSetTargetLoudnessValueLower = impd_read_bits_buf(it_bit_buff, 6); 2046 if (it_bit_buff->error) return it_bit_buff->error; 2047 str_drc_instruction_str->drc_set_target_loudness_value_lower = 2048 bsDrcSetTargetLoudnessValueLower - 63; 2049 } 2050 } 2051 2052 str_drc_instruction_str->depends_on_drc_set_present = 2053 impd_read_bits_buf(it_bit_buff, 1); 2054 if (it_bit_buff->error) return it_bit_buff->error; 2055 2056 str_drc_instruction_str->no_independent_use = 0; 2057 if (str_drc_instruction_str->depends_on_drc_set_present) { 2058 str_drc_instruction_str->depends_on_drc_set = 2059 impd_read_bits_buf(it_bit_buff, 6); 2060 if (it_bit_buff->error) return it_bit_buff->error; 2061 } else { 2062 str_drc_instruction_str->no_independent_use = 2063 impd_read_bits_buf(it_bit_buff, 1); 2064 if (it_bit_buff->error) return it_bit_buff->error; 2065 } 2066 if (version == 0) { 2067 str_drc_instruction_str->requires_eq = 0; 2068 } else { 2069 str_drc_instruction_str->requires_eq = impd_read_bits_buf(it_bit_buff, 1); 2070 if (it_bit_buff->error) return it_bit_buff->error; 2071 } 2072 2073 err = impd_sel_drc_coeff(drc_config, str_drc_instruction_str->drc_location, 2074 &str_p_loc_drc_coefficients_uni_drc); 2075 if (err) return (err); 2076 2077 ch_cnt = drc_config->channel_layout.base_channel_count; 2078 2079 for (c = 0; c < MAX_CHANNEL_COUNT; c++) { 2080 unique_idx[c] = -10; 2081 unique_scaling[c] = -10.0f; 2082 } 2083 2084 if (str_drc_instruction_str->drc_set_effect & 2085 (EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) { 2086 c = 0; 2087 while (c < ch_cnt) { 2088 WORD32 bs_gain_set_idx; 2089 bs_gain_set_idx = impd_read_bits_buf(it_bit_buff, 6); 2090 if (it_bit_buff->error) return it_bit_buff->error; 2091 str_drc_instruction_str->gain_set_index[c] = bs_gain_set_idx - 1; 2092 impd_dec_ducking_scaling( 2093 it_bit_buff, 2094 &(str_drc_instruction_str->str_ducking_modifiers_for_channel[c] 2095 .ducking_scaling_flag), 2096 &(str_drc_instruction_str->str_ducking_modifiers_for_channel[c] 2097 .ducking_scaling)); 2098 2099 c++; 2100 2101 repeat_parameters = impd_read_bits_buf(it_bit_buff, 1); 2102 if (it_bit_buff->error) return it_bit_buff->error; 2103 2104 if (repeat_parameters == 1) { 2105 repeat_parameters_cnt = impd_read_bits_buf(it_bit_buff, 5); 2106 if (it_bit_buff->error) return it_bit_buff->error; 2107 2108 repeat_parameters_cnt += 1; 2109 for (k = 0; k < repeat_parameters_cnt; k++) { 2110 str_drc_instruction_str->gain_set_index[c] = 2111 str_drc_instruction_str->gain_set_index[c - 1]; 2112 str_drc_instruction_str->str_ducking_modifiers_for_channel[c] 2113 .ducking_scaling_flag = 2114 str_drc_instruction_str->str_ducking_modifiers_for_channel[c - 1] 2115 .ducking_scaling_flag; 2116 str_drc_instruction_str->str_ducking_modifiers_for_channel[c] 2117 .ducking_scaling = 2118 str_drc_instruction_str->str_ducking_modifiers_for_channel[c - 1] 2119 .ducking_scaling; 2120 c++; 2121 } 2122 } 2123 } 2124 if (c > ch_cnt) { 2125 return (UNEXPECTED_ERROR); 2126 } 2127 ducking_sequence = -1; 2128 g = 0; 2129 if (str_drc_instruction_str->drc_set_effect & EFFECT_BIT_DUCK_OTHER) { 2130 for (c = 0; c < ch_cnt; c++) { 2131 match = 0; 2132 idx = str_drc_instruction_str->gain_set_index[c]; 2133 factor = str_drc_instruction_str->str_ducking_modifiers_for_channel[c] 2134 .ducking_scaling; 2135 if (idx < 0) { 2136 for (n = 0; n < g; n++) { 2137 if (unique_scaling[n] == factor) { 2138 match = 1; 2139 str_drc_instruction_str->channel_group_of_ch[c] = n; 2140 break; 2141 } 2142 } 2143 if (match == 0) { 2144 unique_idx[g] = idx; 2145 unique_scaling[g] = factor; 2146 str_drc_instruction_str->channel_group_of_ch[c] = g; 2147 g++; 2148 } 2149 } else { 2150 if ((ducking_sequence > 0) && (ducking_sequence != idx)) { 2151 /* drc for ducking can have only one ducking sequence */ 2152 return (UNEXPECTED_ERROR); 2153 } 2154 ducking_sequence = idx; 2155 str_drc_instruction_str->channel_group_of_ch[c] = -1; 2156 } 2157 } 2158 str_drc_instruction_str->num_drc_ch_groups = g; 2159 if (ducking_sequence == -1) { 2160 /* ducking sequence not found */ 2161 return (UNEXPECTED_ERROR); 2162 } 2163 } else if (str_drc_instruction_str->drc_set_effect & EFFECT_BIT_DUCK_SELF) { 2164 for (c = 0; c < ch_cnt; c++) { 2165 match = 0; 2166 idx = str_drc_instruction_str->gain_set_index[c]; 2167 factor = str_drc_instruction_str->str_ducking_modifiers_for_channel[c] 2168 .ducking_scaling; 2169 if (idx >= 0) { 2170 for (n = 0; n < g; n++) { 2171 if ((unique_idx[n] == idx) && (unique_scaling[n] == factor)) { 2172 match = 1; 2173 str_drc_instruction_str->channel_group_of_ch[c] = n; 2174 break; 2175 } 2176 } 2177 if (match == 0) { 2178 unique_idx[g] = idx; 2179 unique_scaling[g] = factor; 2180 str_drc_instruction_str->channel_group_of_ch[c] = g; 2181 g++; 2182 } 2183 } else { 2184 str_drc_instruction_str->channel_group_of_ch[c] = -1; 2185 } 2186 } 2187 str_drc_instruction_str->num_drc_ch_groups = g; 2188 } 2189 2190 for (g = 0; g < str_drc_instruction_str->num_drc_ch_groups; g++) { 2191 WORD32 set = 2192 (str_drc_instruction_str->drc_set_effect & EFFECT_BIT_DUCK_OTHER) 2193 ? ducking_sequence 2194 : unique_idx[g]; 2195 str_drc_instruction_str->gain_set_index_for_channel_group[g] = set; 2196 str_drc_instruction_str->str_ducking_modifiers_for_channel_group[g] 2197 .ducking_scaling = unique_scaling[g]; 2198 if (unique_scaling[g] != 1.0f) { 2199 str_drc_instruction_str->str_ducking_modifiers_for_channel_group[g] 2200 .ducking_scaling_flag = 1; 2201 } else { 2202 str_drc_instruction_str->str_ducking_modifiers_for_channel_group[g] 2203 .ducking_scaling_flag = 0; 2204 } 2205 str_drc_instruction_str->band_count_of_ch_group[g] = 1; 2206 } 2207 } else { 2208 if (((version == 0) || 2209 (str_drc_instruction_str->drc_apply_to_dwnmix != 0)) && 2210 (str_drc_instruction_str->downmix_id[0] != 0) && 2211 (str_drc_instruction_str->downmix_id[0] != ID_FOR_ANY_DOWNMIX) && 2212 (str_drc_instruction_str->dwnmix_id_count == 1)) { 2213 for (i = 0; i < drc_config->dwnmix_instructions_count; i++) { 2214 if (str_drc_instruction_str->downmix_id[0] == 2215 drc_config->dwnmix_instructions[i].downmix_id) 2216 break; 2217 } 2218 if (i == drc_config->dwnmix_instructions_count) { 2219 /* dwnmix_instructions not found */ 2220 return (UNEXPECTED_ERROR); 2221 } 2222 ch_cnt = drc_config->dwnmix_instructions[i].target_channel_count; 2223 } else if (((version == 0) || 2224 (str_drc_instruction_str->drc_apply_to_dwnmix != 0)) && 2225 ((str_drc_instruction_str->downmix_id[0] == 2226 ID_FOR_ANY_DOWNMIX) || 2227 (str_drc_instruction_str->dwnmix_id_count > 1))) { 2228 ch_cnt = 1; 2229 } 2230 2231 c = 0; 2232 while (c < ch_cnt) { 2233 WORD32 bs_gain_set_idx; 2234 WORD32 repeat_gain_set_idx, repeat_gain_set_idx_cnt, temp; 2235 2236 temp = impd_read_bits_buf(it_bit_buff, 7); 2237 if (it_bit_buff->error) return it_bit_buff->error; 2238 2239 bs_gain_set_idx = (temp >> 1) & 0x7f; 2240 repeat_gain_set_idx = temp & 1; 2241 2242 str_drc_instruction_str->gain_set_index[c] = bs_gain_set_idx - 1; 2243 c++; 2244 2245 if (repeat_gain_set_idx == 1) { 2246 repeat_gain_set_idx_cnt = impd_read_bits_buf(it_bit_buff, 5); 2247 if (it_bit_buff->error) return it_bit_buff->error; 2248 2249 repeat_gain_set_idx_cnt += 1; 2250 for (k = 0; k < repeat_gain_set_idx_cnt; k++) { 2251 str_drc_instruction_str->gain_set_index[c] = bs_gain_set_idx - 1; 2252 c++; 2253 } 2254 } 2255 } 2256 if (c > ch_cnt) { 2257 return (UNEXPECTED_ERROR); 2258 } 2259 2260 g = 0; 2261 if ((str_drc_instruction_str->downmix_id[0] == ID_FOR_ANY_DOWNMIX) || 2262 (str_drc_instruction_str->dwnmix_id_count > 1)) { 2263 WORD32 idx = str_drc_instruction_str->gain_set_index[0]; 2264 if (idx >= 0) { 2265 unique_idx[0] = idx; 2266 g = 1; 2267 } 2268 } else { 2269 for (c = 0; c < ch_cnt; c++) { 2270 WORD32 idx = str_drc_instruction_str->gain_set_index[c]; 2271 match = 0; 2272 if (idx >= 0) { 2273 for (n = 0; n < g; n++) { 2274 if (unique_idx[n] == idx) { 2275 match = 1; 2276 str_drc_instruction_str->channel_group_of_ch[c] = n; 2277 break; 2278 } 2279 } 2280 if (match == 0) { 2281 unique_idx[g] = idx; 2282 str_drc_instruction_str->channel_group_of_ch[c] = g; 2283 g++; 2284 } 2285 } else { 2286 str_drc_instruction_str->channel_group_of_ch[c] = -1; 2287 } 2288 } 2289 } 2290 2291 str_drc_instruction_str->num_drc_ch_groups = g; 2292 for (g = 0; g < str_drc_instruction_str->num_drc_ch_groups; g++) { 2293 WORD32 set, band_count; 2294 2295 set = unique_idx[g]; 2296 str_drc_instruction_str->gain_set_index_for_channel_group[g] = set; 2297 2298 if (str_p_loc_drc_coefficients_uni_drc != NULL && 2299 set < str_p_loc_drc_coefficients_uni_drc->gain_set_count) { 2300 band_count = 2301 str_p_loc_drc_coefficients_uni_drc->gain_set_params[set].band_count; 2302 } else { 2303 band_count = 1; 2304 } 2305 2306 err = impd_dec_gain_modifiers( 2307 it_bit_buff, version, band_count, 2308 &(str_drc_instruction_str->str_gain_modifiers_of_ch_group[g])); 2309 if (err) return (err); 2310 } 2311 } 2312 2313 return (0); 2314 } 2315 WORD32 2316 impd_parse_loudness_info(ia_bit_buf_struct* it_bit_buff, WORD32 version, 2317 ia_loudness_info_struct* loudness_info) { 2318 WORD32 err = 0, sample_peak_level, true_peak_level, i, temp; 2319 2320 loudness_info->drc_set_id = impd_read_bits_buf(it_bit_buff, 6); 2321 if (it_bit_buff->error) return it_bit_buff->error; 2322 2323 if (version >= 1) { 2324 loudness_info->eq_set_id = impd_read_bits_buf(it_bit_buff, 6); 2325 if (it_bit_buff->error) return it_bit_buff->error; 2326 } else { 2327 loudness_info->eq_set_id = 0; 2328 } 2329 2330 temp = impd_read_bits_buf(it_bit_buff, 8); 2331 if (it_bit_buff->error) return it_bit_buff->error; 2332 2333 loudness_info->downmix_id = (temp >> 1) & 0x7f; 2334 loudness_info->sample_peak_level_present = temp & 1; 2335 2336 if (loudness_info->sample_peak_level_present) { 2337 sample_peak_level = impd_read_bits_buf(it_bit_buff, 12); 2338 if (it_bit_buff->error) return it_bit_buff->error; 2339 2340 if (sample_peak_level == 0) { 2341 loudness_info->sample_peak_level_present = 0; 2342 loudness_info->sample_peak_level = 0.0f; 2343 } else { 2344 loudness_info->sample_peak_level = 20.0f - sample_peak_level * 0.03125f; 2345 } 2346 } 2347 2348 loudness_info->true_peak_level_present = impd_read_bits_buf(it_bit_buff, 1); 2349 if (it_bit_buff->error) return it_bit_buff->error; 2350 2351 if (loudness_info->true_peak_level_present) { 2352 true_peak_level = impd_read_bits_buf(it_bit_buff, 12); 2353 if (it_bit_buff->error) return it_bit_buff->error; 2354 2355 if (true_peak_level == 0) { 2356 loudness_info->true_peak_level_present = 0; 2357 loudness_info->true_peak_level = 0.0f; 2358 } else { 2359 loudness_info->true_peak_level = 20.0f - true_peak_level * 0.03125f; 2360 } 2361 2362 temp = impd_read_bits_buf(it_bit_buff, 6); 2363 if (it_bit_buff->error) return it_bit_buff->error; 2364 2365 loudness_info->true_peak_level_measurement_system = (temp >> 2) & 0xf; 2366 loudness_info->true_peak_level_reliability = temp & 3; 2367 } 2368 2369 loudness_info->measurement_count = impd_read_bits_buf(it_bit_buff, 4); 2370 if (it_bit_buff->error) return it_bit_buff->error; 2371 2372 for (i = 0; i < loudness_info->measurement_count; i++) { 2373 err = impd_parse_loudness_measure(it_bit_buff, 2374 &(loudness_info->loudness_measure[i])); 2375 if (err) return (err); 2376 } 2377 2378 return (0); 2379 }