NAME: III_exponents() DESCRIPTION: calculate scalefactor exponents */
| 844 | DESCRIPTION: calculate scalefactor exponents |
| 845 | */ |
| 846 | static |
| 847 | void III_exponents(struct channel const *channel, |
| 848 | unsigned int const *sfbwidth, signed int exponents[39]) |
| 849 | { |
| 850 | signed int gain; |
| 851 | unsigned int scalefac_multiplier, sfbi; |
| 852 | stack(__FUNCTION__, __FILE__, __LINE__); |
| 853 | |
| 854 | gain = (signed int) channel->global_gain - 210; |
| 855 | scalefac_multiplier = (channel->flags & scalefac_scale) ? 2 : 1; |
| 856 | |
| 857 | if (channel->block_type == 2) { |
| 858 | unsigned int l; |
| 859 | signed int gain0, gain1, gain2; |
| 860 | |
| 861 | sfbi = l = 0; |
| 862 | |
| 863 | if (channel->flags & mixed_block_flag) { |
| 864 | unsigned int premask; |
| 865 | |
| 866 | premask = (channel->flags & preflag) ? ~0 : 0; |
| 867 | |
| 868 | /* long block subbands 0-1 */ |
| 869 | |
| 870 | while (l < 36) { |
| 871 | exponents[sfbi] = gain - |
| 872 | (signed int) ((channel->scalefac[sfbi] + (pretab[sfbi] & premask)) << |
| 873 | scalefac_multiplier); |
| 874 | |
| 875 | l += sfbwidth[sfbi++]; |
| 876 | } |
| 877 | } |
| 878 | |
| 879 | /* this is probably wrong for 8000 Hz short/mixed blocks */ |
| 880 | |
| 881 | gain0 = gain - 8 * (signed int) channel->subblock_gain[0]; |
| 882 | gain1 = gain - 8 * (signed int) channel->subblock_gain[1]; |
| 883 | gain2 = gain - 8 * (signed int) channel->subblock_gain[2]; |
| 884 | |
| 885 | while (l < 576) { |
| 886 | exponents[sfbi + 0] = gain0 - |
| 887 | (signed int) (channel->scalefac[sfbi + 0] << scalefac_multiplier); |
| 888 | exponents[sfbi + 1] = gain1 - |
| 889 | (signed int) (channel->scalefac[sfbi + 1] << scalefac_multiplier); |
| 890 | exponents[sfbi + 2] = gain2 - |
| 891 | (signed int) (channel->scalefac[sfbi + 2] << scalefac_multiplier); |
| 892 | |
| 893 | l += 3 * sfbwidth[sfbi]; |
| 894 | sfbi += 3; |
| 895 | } |
| 896 | } |
| 897 | else { /* channel->block_type != 2 */ |
| 898 | if (channel->flags & preflag) { |
| 899 | for (sfbi = 0; sfbi < 22; ++sfbi) { |
| 900 | exponents[sfbi] = gain - |
| 901 | (signed int) ((channel->scalefac[sfbi] + pretab[sfbi]) << |
| 902 | scalefac_multiplier); |
| 903 | } |