diff options
Diffstat (limited to 'gst/siren/huffman.c')
-rw-r--r-- | gst/siren/huffman.c | 155 |
1 files changed, 101 insertions, 54 deletions
diff --git a/gst/siren/huffman.c b/gst/siren/huffman.c index 35a4ae05c..b563b43b9 100644 --- a/gst/siren/huffman.c +++ b/gst/siren/huffman.c @@ -28,7 +28,9 @@ static short current_word = 0; static int bit_idx = 0; static int *bitstream_ptr = NULL; -int next_bit() { +int +next_bit () +{ if (bitstream_ptr == NULL) return -1; @@ -40,14 +42,19 @@ int next_bit() { return (current_word >> --bit_idx) & 1; } -void set_bitstream(int *stream) { +void +set_bitstream (int *stream) +{ bitstream_ptr = stream; - current_word = *bitstream_ptr; + current_word = *bitstream_ptr; bit_idx = 0; } -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) { +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; @@ -56,8 +63,9 @@ int compute_region_powers(int number_of_regions, float *coefs, int *drp_num_bits 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]; + for (i = 0; i < region_size; i++) { + region_power += + coefs[(region * region_size) + i] * coefs[(region * region_size) + i]; } region_power *= region_size_inverse; @@ -65,7 +73,7 @@ int compute_region_powers(int number_of_regions, float *coefs, int *drp_num_bits max_idx = 64; for (i = 0; i < 6; i++) { idx = (min_idx + max_idx) / 2; - if (region_power_table_boundary[idx-1] <= region_power) { + if (region_power_table_boundary[idx - 1] <= region_power) { min_idx = idx; } else { max_idx = idx; @@ -75,67 +83,78 @@ int compute_region_powers(int number_of_regions, float *coefs, int *drp_num_bits } - 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; + 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] < (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); + 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++) { + 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); + 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; + 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]; + 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; } -int decode_envelope(int number_of_regions, float *decoder_standard_deviation, int *absolute_region_power_index, int esf_adjustment) { +int +decode_envelope (int number_of_regions, float *decoder_standard_deviation, + int *absolute_region_power_index, int esf_adjustment) +{ int index; int i; int envelope_bits = 0; index = 0; for (i = 0; i < 5; i++) - index = (index<<1) | next_bit(); + index = (index << 1) | next_bit (); envelope_bits = 5; absolute_region_power_index[0] = index - esf_adjustment; - decoder_standard_deviation[0] = standard_deviation[absolute_region_power_index[0] + 24]; + decoder_standard_deviation[0] = + standard_deviation[absolute_region_power_index[0] + 24]; for (i = 1; i < number_of_regions; i++) { index = 0; do { - index = differential_decoder_tree[i-1][index][next_bit()]; + index = differential_decoder_tree[i - 1][index][next_bit ()]; envelope_bits++; } while (index > 0); - absolute_region_power_index[i] = absolute_region_power_index[i-1] - index - 12; - decoder_standard_deviation[i] = standard_deviation[absolute_region_power_index[i] + 24]; + absolute_region_power_index[i] = + absolute_region_power_index[i - 1] - index - 12; + decoder_standard_deviation[i] = + standard_deviation[absolute_region_power_index[i] + 24]; } return envelope_bits; @@ -143,7 +162,9 @@ int decode_envelope(int number_of_regions, float *decoder_standard_deviation, in -static int huffman_vector(int category, int power_idx, float *mlts, int *out) { +static int +huffman_vector (int category, int power_idx, float *mlts, int *out) +{ int i, j; float temp_value = deviation_inverse[power_idx] * step_size_inverse[category]; int sign_idx, idx, non_zeroes, max, bits_available; @@ -154,11 +175,11 @@ static int huffman_vector(int category, int power_idx, float *mlts, int *out) { for (i = 0; i < number_of_vectors[category]; i++) { sign_idx = idx = non_zeroes = 0; for (j = 0; j < vector_dimension[category]; j++) { - max = (int) ((fabs(*mlts) * temp_value) + dead_zone[category]); + max = (int) ((fabs (*mlts) * temp_value) + dead_zone[category]); if (max != 0) { sign_idx <<= 1; non_zeroes++; - if (*mlts > 0) + if (*mlts > 0) sign_idx++; if (max > max_bin[category] || max < 0) max = max_bin[category]; @@ -171,11 +192,17 @@ static int huffman_vector(int category, int power_idx, float *mlts, int *out) { region_bits += bitcount_tables[category][idx] + non_zeroes; bits_available -= bitcount_tables[category][idx] + non_zeroes; if (bits_available < 0) { - *out++ = current_word + (((code_tables[category][idx] << non_zeroes) + sign_idx) >> -bits_available); + *out++ = + current_word + (((code_tables[category][idx] << non_zeroes) + + sign_idx) >> -bits_available); bits_available += 32; - current_word = ((code_tables[category][idx] << non_zeroes) + sign_idx) << bits_available; + current_word = + ((code_tables[category][idx] << non_zeroes) + + sign_idx) << bits_available; } else { - current_word += ((code_tables[category][idx] << non_zeroes) + sign_idx) << bits_available; + current_word += + ((code_tables[category][idx] << non_zeroes) + + sign_idx) << bits_available; } } @@ -184,20 +211,28 @@ static int huffman_vector(int category, int power_idx, float *mlts, int *out) { return region_bits; } -int quantize_mlt(int number_of_regions, int rate_control_possibilities, int number_of_available_bits, float *coefs, int *absolute_region_power_index, int *power_categories, int *category_balance, int *region_mlt_bit_counts, int *region_mlt_bits) { +int +quantize_mlt (int number_of_regions, int rate_control_possibilities, + int number_of_available_bits, float *coefs, + int *absolute_region_power_index, int *power_categories, + int *category_balance, int *region_mlt_bit_counts, int *region_mlt_bits) +{ int region; int mlt_bits = 0; int rate_control; - for (rate_control = 0; rate_control < ((rate_control_possibilities >> 1) - 1); rate_control++) + for (rate_control = 0; rate_control < ((rate_control_possibilities >> 1) - 1); + rate_control++) power_categories[category_balance[rate_control]]++; for (region = 0; region < number_of_regions; region++) { if (power_categories[region] > 6) region_mlt_bit_counts[region] = 0; else - region_mlt_bit_counts[region] = huffman_vector(power_categories[region], absolute_region_power_index[region], coefs + (region_size * region), - region_mlt_bits + (4*region)); + region_mlt_bit_counts[region] = + huffman_vector (power_categories[region], + absolute_region_power_index[region], coefs + (region_size * region), + region_mlt_bits + (4 * region)); mlt_bits += region_mlt_bit_counts[region]; } @@ -214,13 +249,16 @@ int quantize_mlt(int number_of_regions, int rate_control_possibilities, int numb if (power_categories[region] > 6) region_mlt_bit_counts[region] = 0; else - region_mlt_bit_counts[region] = huffman_vector(power_categories[region], absolute_region_power_index[region], coefs + (region_size * region), - region_mlt_bits + (4*region)); + region_mlt_bit_counts[region] = + huffman_vector (power_categories[region], + absolute_region_power_index[region], coefs + (region_size * region), + region_mlt_bits + (4 * region)); mlt_bits += region_mlt_bit_counts[region]; } - while(mlt_bits > number_of_available_bits && rate_control < rate_control_possibilities) { + while (mlt_bits > number_of_available_bits + && rate_control < rate_control_possibilities) { region = category_balance[rate_control]; power_categories[region]++; mlt_bits -= region_mlt_bit_counts[region]; @@ -228,8 +266,10 @@ int quantize_mlt(int number_of_regions, int rate_control_possibilities, int numb if (power_categories[region] > 6) region_mlt_bit_counts[region] = 0; else - region_mlt_bit_counts[region] = huffman_vector(power_categories[region], absolute_region_power_index[region], coefs + (region_size * region), - region_mlt_bits + (4*region)); + region_mlt_bit_counts[region] = + huffman_vector (power_categories[region], + absolute_region_power_index[region], coefs + (region_size * region), + region_mlt_bits + (4 * region)); mlt_bits += region_mlt_bit_counts[region]; @@ -239,7 +279,9 @@ int quantize_mlt(int number_of_regions, int rate_control_possibilities, int numb return rate_control; } -static int get_dw(SirenDecoder decoder) { +static int +get_dw (SirenDecoder decoder) +{ int ret = decoder->dw1 + decoder->dw4; if ((ret & 0x8000) != 0) @@ -256,7 +298,11 @@ static int get_dw(SirenDecoder decoder) { -int decode_vector(SirenDecoder decoder, int number_of_regions, int number_of_available_bits, float *decoder_standard_deviation, int *power_categories, float *coefs, int scale_factor) { +int +decode_vector (SirenDecoder decoder, int number_of_regions, + int number_of_available_bits, float *decoder_standard_deviation, + int *power_categories, float *coefs, int scale_factor) +{ float *coefs_ptr; float decoded_value; float noise; @@ -286,7 +332,7 @@ int decode_vector(SirenDecoder decoder, int number_of_regions, int number_of_ava break; } - index = decoder_tree[index + next_bit()]; + index = decoder_tree[index + next_bit ()]; number_of_available_bits--; } while ((index & 1) == 0); @@ -294,11 +340,12 @@ int decode_vector(SirenDecoder decoder, int number_of_regions, int number_of_ava if (error == 0 && number_of_available_bits >= 0) { for (j = 0; j < vector_dimension[category]; j++) { - decoded_value = mlt_quant[category][index & ((1 << index_table[category]) - 1)]; + decoded_value = + mlt_quant[category][index & ((1 << index_table[category]) - 1)]; index >>= index_table[category]; if (decoded_value != 0) { - if (next_bit() == 0) + if (next_bit () == 0) decoded_value *= -decoder_standard_deviation[region]; else decoded_value *= decoder_standard_deviation[region]; @@ -328,7 +375,7 @@ int decode_vector(SirenDecoder decoder, int number_of_regions, int number_of_ava for (j = 0; j < region_size; j++) { if (*coefs_ptr != 0) { i++; - if (fabs(*coefs_ptr) > 2.0 * decoder_standard_deviation[region]) { + if (fabs (*coefs_ptr) > 2.0 * decoder_standard_deviation[region]) { i += 3; } } @@ -345,7 +392,7 @@ int decode_vector(SirenDecoder decoder, int number_of_regions, int number_of_ava noise = decoder_standard_deviation[region] * noise_category6[i]; } else if (category == 7) { - noise = decoder_standard_deviation[region] * noise_category7; + noise = decoder_standard_deviation[region] * noise_category7; } else { noise = 0; } @@ -353,10 +400,10 @@ int decode_vector(SirenDecoder decoder, int number_of_regions, int number_of_ava coefs_ptr = coefs + (region * region_size); if (category == 5 || category == 6 || category == 7) { - dw1 = get_dw(decoder); - dw2 = get_dw(decoder); + dw1 = get_dw (decoder); + dw2 = get_dw (decoder); - for (j=0; j<10; j++) { + for (j = 0; j < 10; j++) { if (category == 7 || *coefs_ptr == 0) { if ((dw1 & 1)) *coefs_ptr = noise; |