+static int32_t quantize_value(int32_t value, softfloat quant)
+{
+ int32_t offset = 1 << (quant.e - 1);
+
+ value = mul32(value, quant.m) + offset;
+ value = value >> quant.e;
+ return value;
+}
+
+static int calc_one_scale(int32_t peak_cb, int abits, softfloat *quant)
+{
+ int32_t peak;
+ int our_nscale, try_remove;
+ softfloat our_quant;
+
+ av_assert0(peak_cb <= 0);
+ av_assert0(peak_cb >= -2047);
+
+ our_nscale = 127;
+ peak = cb_to_level[-peak_cb];
+
+ for (try_remove = 64; try_remove > 0; try_remove >>= 1) {
+ if (scalefactor_inv[our_nscale - try_remove].e + stepsize_inv[abits].e <= 17)
+ continue;
+ our_quant.m = mul32(scalefactor_inv[our_nscale - try_remove].m, stepsize_inv[abits].m);
+ our_quant.e = scalefactor_inv[our_nscale - try_remove].e + stepsize_inv[abits].e - 17;
+ if ((ff_dca_quant_levels[abits] - 1) / 2 < quantize_value(peak, our_quant))
+ continue;
+ our_nscale -= try_remove;
+ }
+
+ if (our_nscale >= 125)
+ our_nscale = 124;
+
+ quant->m = mul32(scalefactor_inv[our_nscale].m, stepsize_inv[abits].m);
+ quant->e = scalefactor_inv[our_nscale].e + stepsize_inv[abits].e - 17;
+ av_assert0((ff_dca_quant_levels[abits] - 1) / 2 >= quantize_value(peak, *quant));
+
+ return our_nscale;
+}
+
+static void quantize_all(DCAEncContext *c)
+{
+ int sample, band, ch;
+
+ for (ch = 0; ch < c->fullband_channels; ch++)
+ for (band = 0; band < 32; band++)
+ for (sample = 0; sample < SUBBAND_SAMPLES; sample++)
+ c->quantized[ch][band][sample] = quantize_value(c->subband[ch][band][sample], c->quant[ch][band]);
+}
+
+static void accumulate_huff_bit_consumption(int abits, int32_t *quantized, uint32_t *result)
+{
+ uint8_t sel, id = abits - 1;
+ for (sel = 0; sel < ff_dca_quant_index_group_size[id]; sel++)
+ result[sel] += ff_dca_vlc_calc_quant_bits(quantized, SUBBAND_SAMPLES, sel, id);
+}
+
+static uint32_t set_best_code(uint32_t vlc_bits[DCA_CODE_BOOKS][7], uint32_t clc_bits[DCA_CODE_BOOKS], int32_t res[DCA_CODE_BOOKS])
+{
+ uint8_t i, sel;
+ uint32_t best_sel_bits[DCA_CODE_BOOKS];
+ int32_t best_sel_id[DCA_CODE_BOOKS];
+ uint32_t t, bits = 0;
+
+ for (i = 0; i < DCA_CODE_BOOKS; i++) {
+
+ av_assert0(!((!!vlc_bits[i][0]) ^ (!!clc_bits[i])));
+ if (vlc_bits[i][0] == 0) {
+ /* do not transmit adjustment index for empty codebooks */
+ res[i] = ff_dca_quant_index_group_size[i];
+ /* and skip it */
+ continue;
+ }
+
+ best_sel_bits[i] = vlc_bits[i][0];
+ best_sel_id[i] = 0;
+ for (sel = 0; sel < ff_dca_quant_index_group_size[i]; sel++) {
+ if (best_sel_bits[i] > vlc_bits[i][sel] && vlc_bits[i][sel]) {
+ best_sel_bits[i] = vlc_bits[i][sel];
+ best_sel_id[i] = sel;
+ }
+ }
+
+ /* 2 bits to transmit scale factor adjustment index */
+ t = best_sel_bits[i] + 2;
+ if (t < clc_bits[i]) {
+ res[i] = best_sel_id[i];
+ bits += t;
+ } else {
+ res[i] = ff_dca_quant_index_group_size[i];
+ bits += clc_bits[i];
+ }
+ }
+ return bits;
+}
+
+static uint32_t set_best_abits_code(int abits[DCAENC_SUBBANDS], int bands, int32_t *res)
+{
+ uint8_t i;
+ uint32_t t;
+ int32_t best_sel = 6;
+ int32_t best_bits = bands * 5;
+
+ /* Check do we have subband which cannot be encoded by Huffman tables */
+ for (i = 0; i < bands; i++) {
+ if (abits[i] > 12) {
+ *res = best_sel;
+ return best_bits;
+ }
+ }
+
+ for (i = 0; i < DCA_BITALLOC_12_COUNT; i++) {
+ t = ff_dca_vlc_calc_alloc_bits(abits, bands, i);
+ if (t < best_bits) {
+ best_bits = t;
+ best_sel = i;
+ }
+ }
+
+ *res = best_sel;
+ return best_bits;
+}
+