| 761 | } |
| 762 | |
| 763 | int32_t calc_bits(Encoder &enc, int32_t val) { |
| 764 | static uint32_t calc_bits_data[] = {0x00, 0x13, 0x16, 0x03, 0x1D, 0x00}; |
| 765 | |
| 766 | int32_t bitPower = 3; |
| 767 | int32_t result = enc.m_numColumns * 5 + 20; |
| 768 | |
| 769 | float halfVal = float(val) * 0.5f; |
| 770 | float *var_18 = enc.m_levelSlots[enc.m_levels]; |
| 771 | float *var_8 = enc.m_levelSlots[enc.m_levels]; |
| 772 | |
| 773 | for (int32_t var_1C = 0; var_1C < enc.m_numColumns; ++var_1C) { |
| 774 | int32_t minValue = 0x10000; |
| 775 | int32_t maxValue = -0x10000; |
| 776 | if (enc.m_samples_per_subband > 0) { |
| 777 | float *pSlotData = var_8; |
| 778 | for (int ebp = enc.m_samples_per_subband; ebp != 0; --ebp) { |
| 779 | int32_t testVal = (int32_t)floor((*pSlotData + halfVal) / float(val)); |
| 780 | if (minValue > testVal) { |
| 781 | minValue = testVal; |
| 782 | } |
| 783 | |
| 784 | if (maxValue < testVal) { |
| 785 | maxValue = testVal; |
| 786 | } |
| 787 | |
| 788 | pSlotData += enc.m_numColumns; |
| 789 | } |
| 790 | } |
| 791 | |
| 792 | int32_t absMaxVal = abs(minValue); |
| 793 | if (absMaxVal < maxValue) { |
| 794 | absMaxVal = maxValue; |
| 795 | } else if (absMaxVal < -maxValue) { |
| 796 | absMaxVal = -maxValue; |
| 797 | } |
| 798 | |
| 799 | if (absMaxVal == 0) { |
| 800 | minValue = 0; |
| 801 | enc.m_pFormatIdPerColumn[var_1C] = 0; |
| 802 | } else if (absMaxVal <= 4) { |
| 803 | int32_t ebx = 1; |
| 804 | int32_t var_28 = absMaxVal * 3 + 14; |
| 805 | if (absMaxVal != 1) { |
| 806 | ebx = ((absMaxVal - 2) < 1) ? 2 : 3; |
| 807 | } |
| 808 | |
| 809 | minValue = 0; |
| 810 | maxValue = 0; |
| 811 | for (int ebp = 0; ebp < enc.m_samples_per_subband; ++ebp) { |
| 812 | int32_t v = (int)floor((var_18[(ebp * enc.m_numColumns) + var_1C] + halfVal) / float(val)); |
| 813 | if (v) { |
| 814 | if (ebx != 1) { |
| 815 | if (v == -1 || v == 1) { |
| 816 | minValue += 4; |
| 817 | maxValue += 3; |
| 818 | } else { |
| 819 | minValue += ebx + 2; |
| 820 | maxValue += ebx + 1; |