int compute_region_powers(int number_of_regions, float *coefs, int *drp_num_bits, int *drp_code_bits, int *absolute_region_power_index, int esf_adjustment) { float region_power = 0; int num_bits; int idx; int max_idx, min_idx; int region, i; for (region = 0; region < number_of_regions; region++) { region_power = 0.0f; for (i = 0 ; i < region_size; i++) { region_power += coefs[(region*region_size)+i] * coefs[(region*region_size)+i]; } region_power *= region_size_inverse; min_idx = 0; max_idx = 64; for (i = 0; i < 6; i++) { idx = (min_idx + max_idx) / 2; if (region_power_table_boundary[idx-1] <= region_power) { min_idx = idx; } else { max_idx = idx; } } absolute_region_power_index[region] = min_idx - 24; } for (region = number_of_regions-2; region >= 0; region--) { if (absolute_region_power_index[region] < absolute_region_power_index[region+1] - 11) absolute_region_power_index[region] = absolute_region_power_index[region+1] - 11; } if (absolute_region_power_index[0] < (1-esf_adjustment)) absolute_region_power_index[0] = (1-esf_adjustment); if (absolute_region_power_index[0] > (31-esf_adjustment)) absolute_region_power_index[0] = (31-esf_adjustment); drp_num_bits[0] = 5; drp_code_bits[0] = absolute_region_power_index[0] + esf_adjustment; for(region = 1; region < number_of_regions; region++) { if (absolute_region_power_index[region] < (-8 - esf_adjustment)) absolute_region_power_index[region] = (-8 - esf_adjustment); if (absolute_region_power_index[region] > (31-esf_adjustment)) absolute_region_power_index[region] = (31-esf_adjustment); } num_bits = 5; for(region = 0; region < number_of_regions-1; region++) { idx = absolute_region_power_index[region+1] - absolute_region_power_index[region] + 12; if (idx < 0) idx = 0; absolute_region_power_index[region+1] = absolute_region_power_index[region] + idx - 12; drp_num_bits[region+1] = differential_region_power_bits[region][idx]; drp_code_bits[region+1] = differential_region_power_codes[region][idx]; num_bits += drp_num_bits[region+1]; } return num_bits; } /*************************************************************************** Procedure/Function: compute_region_powers Syntax: int compute_region_powers( number_of_regions, mlt_coefs, drp_num_bits, drp_code_bits, absolute_region_power_index) int number_of_regions; float mlt_coefs[MAX_DCT_SIZE]; int drp_num_bits[MAX_NUM_REGIONS]; int drp_code_bits[MAX_NUM_REGIONS]; int absolute_region_power_index[MAX_NUM_REGIONS]; Description: Computes the power for each of the regions ***************************************************************************/ int compute_region_powers(number_of_regions, mlt_coefs, drp_num_bits, drp_code_bits, absolute_region_power_index) int number_of_regions; float mlt_coefs[MAX_DCT_SIZE]; int drp_num_bits[MAX_NUM_REGIONS]; int drp_code_bits[MAX_NUM_REGIONS]; int absolute_region_power_index[MAX_NUM_REGIONS]; { float *input_ptr; int iterations; float ftemp0, ftemp1; int index, index_min, index_max; int region; int j; int differential_region_power_index[MAX_NUM_REGIONS]; int number_of_bits; input_ptr = mlt_coefs; for (region=0; region> 1; if (ftemp0 < region_power_table_boundary[index-1]) index_max = index; else index_min = index; } absolute_region_power_index[region] = index_min-REGION_POWER_TABLE_NUM_NEGATIVES; } /* Before we differentially encode the quantized region powers, adjust upward the valleys to make sure all the peaks can be accurately represented. */ for (region = number_of_regions-2; region >= 0; region--) { if (absolute_region_power_index[region] < absolute_region_power_index[region+1] - DRP_DIFF_MAX) absolute_region_power_index[region] = absolute_region_power_index[region+1] - DRP_DIFF_MAX; } /* The MLT is currently scaled too low by the factor ENCODER_SCALE_FACTOR(=18318)/32768 * (1./sqrt(160). This is the ninth power of 1 over the square root of 2. So later we will add ESF_ADJUSTMENT_TO_RMS_INDEX (now 9) to drp_code_bits[0]. */ /* drp_code_bits[0] can range from 1 to 31. 0 will be used only as an escape sequence. */ if (absolute_region_power_index[0] < 1-ESF_ADJUSTMENT_TO_RMS_INDEX) absolute_region_power_index[0] = 1-ESF_ADJUSTMENT_TO_RMS_INDEX; if (absolute_region_power_index[0] > 31-ESF_ADJUSTMENT_TO_RMS_INDEX) absolute_region_power_index[0] = 31-ESF_ADJUSTMENT_TO_RMS_INDEX; differential_region_power_index[0] = absolute_region_power_index[0]; number_of_bits = 5; drp_num_bits[0] = 5; drp_code_bits[0] = absolute_region_power_index[0] + ESF_ADJUSTMENT_TO_RMS_INDEX; /* Lower limit the absolute region power indices to -8 and upper limit them to 31. Such extremes may be mathematically impossible anyway.*/ for (region=1; region 31-ESF_ADJUSTMENT_TO_RMS_INDEX) absolute_region_power_index[region] = 31-ESF_ADJUSTMENT_TO_RMS_INDEX; } for (region=1; region