Ticket #2686: aac-improvements-wip-v2-rclookahead.2.patch
| File aac-improvements-wip-v2-rclookahead.2.patch, 30.0 KB (added by , 13 years ago) |
|---|
-
libavcodec/aaccoder.c
diff --git a/libavcodec/aaccoder.c b/libavcodec/aaccoder.c index 45fbc2d..7ffa300 100644
a b static const uint8_t *run_value_bits[2] = { 57 57 run_value_bits_long, run_value_bits_short 58 58 }; 59 59 60 61 60 /** 62 61 * Quantize one coefficient. 63 62 * @return absolute value of the quantized coefficient … … static const uint8_t *run_value_bits[2] = { 66 65 static av_always_inline int quant(float coef, const float Q) 67 66 { 68 67 float a = coef * Q; 69 return sqrtf(a * sqrtf(a)) + 0.4054 ;68 return sqrtf(a * sqrtf(a)) + 0.4054f; 70 69 } 71 70 72 71 static void quantize_bands(int *out, const float *in, const float *scaled, … … static void quantize_bands(int *out, const float *in, const float *scaled, 76 75 double qc; 77 76 for (i = 0; i < size; i++) { 78 77 qc = scaled[i] * Q34; 79 out[i] = (int)FFMIN(qc + 0.4054 , (double)maxval);78 out[i] = (int)FFMIN(qc + 0.4054f, (double)maxval); 80 79 if (is_signed && in[i] < 0.0f) { 81 80 out[i] = -out[i]; 82 81 } … … static float find_max_val(int group_len, int swb_size, const float *scaled) { 282 281 return maxval; 283 282 } 284 283 284 static float find_max_absval(int group_len, int swb_size, const float *scaled) { 285 float maxval = 0.0f; 286 int w2, i; 287 for (w2 = 0; w2 < group_len; w2++) { 288 for (i = 0; i < swb_size; i++) { 289 maxval = FFMAX(maxval, fabs(scaled[w2*128+i])); 290 } 291 } 292 return maxval; 293 } 294 285 295 static int find_min_book(float maxval, int sf) { 286 296 float Q = ff_aac_pow2sf_tab[POW_SF2_ZERO - sf + SCALE_ONE_POS - SCALE_DIV_512]; 287 297 float Q34 = sqrtf(Q * sqrtf(Q)); … … static void search_for_quantizers_anmr(AVCodecContext *avctx, AACEncContext *s, 701 711 sce->sf_idx[(w+w2)*16+g] = sce->sf_idx[w*16+g]; 702 712 } 703 713 714 #define sclip(x) av_clip(x,60,218) 715 704 716 /** 705 717 * two-loop quantizers search taken from ISO 13818-7 Appendix C 706 718 */ 707 719 static void search_for_quantizers_twoloop(AVCodecContext *avctx, 708 720 AACEncContext *s, 709 721 SingleChannelElement *sce, 710 constfloat lambda)722 float lambda) 711 723 { 712 724 int start = 0, i, w, w2, g; 713 int destbits = avctx->bit_rate * 1024.0 / avctx->sample_rate / avctx->channels * (lambda / 120.f); 714 float dists[128] = { 0 }, uplims[128]; 725 int destbits = avctx->bit_rate * 1024.0 / avctx->sample_rate 726 / ((avctx->flags & CODEC_FLAG_QSCALE) ? 2.0f : avctx->channels) 727 * (lambda / 120.f); 728 int toomanybits, toofewbits; 729 float dists[128] = { 0 }, uplims[128], energies[128]; 715 730 float maxvals[128]; 716 int fflag, minscaler; 731 732 /* rdlambda controls the maximum tolerated distortion. Twoloop 733 * will keep iterating until it fails to lower it or it reaches 734 * ulimit * rdlambda. Keeping it low increases quality on difficult 735 * signals, but lower it too much, and bits will be taken from weak 736 * signals, creating "holes". A balance is necesary. 737 */ 738 float rdlambda = av_clipf(2 * 120.f / lambda, 0.0625f, 16.0f); 739 float rdmax = (avctx->flags & CODEC_FLAG_QSCALE) ? 4.0f : 1.0f; 740 741 /* sfoffs controls an offset of optmium allocation that will be 742 * applied based on lambda. Keep it real and modest, the loop 743 * will take care of the rest, this just accelerates convergence 744 */ 745 float sfoffs = av_clipf((120.0f - lambda) * 0.1f, -5, 10); 746 747 int fflag, minscaler, nminscaler, minrdsf; 717 748 int its = 0; 718 749 int allz = 0; 719 float minthr = INFINITY; 750 int tbits; 751 752 /* zeroscale controls a multiplier of the threshold, if band energy 753 * is below this, a zero is forced. Keep it lower than 1, unless 754 * low lambda is used, because energy < threshold doesn't mean there's 755 * no audible signal outright, it's just energy. Also make it rise 756 * slower than rdlambda, as rdscale has due compensation with 757 * noisy band depriorization below, whereas zeroing logic is rather dumb 758 */ 759 float zeroscale; 760 if (lambda > 120.f) 761 zeroscale = av_clipf(powf(120.f / lambda, 0.25f), 0.0625f, 1.0f); 762 else if (lambda < 80.f) 763 zeroscale = av_clipf(powf(80.f / lambda, 0.25f), 1.0f, 2.0f); 764 else 765 zeroscale = 1.f; 766 767 if (s->psy.bitres.alloc >= 0) { 768 // Psy granted us extra bits to use, from the reservoire 769 destbits = s->psy.bitres.alloc * (lambda / 120.f); 770 } 771 772 if (avctx->flags & CODEC_FLAG_QSCALE) { 773 // When using a constant Q-scale, be lenient on bit over/underflow 774 toomanybits = destbits * 3; 775 toofewbits = destbits / 2; 776 } else { 777 // When using ABR, be strict 778 toomanybits = destbits + destbits/16; 779 toofewbits = destbits - destbits/16; 780 } 720 781 721 782 // for values above this the decoder might end up in an endless loop 722 783 // due to always having more bits than what can be encoded. 723 784 destbits = FFMIN(destbits, 5800); 785 toomanybits = FFMIN(toomanybits, 5800); 786 toofewbits = FFMIN(toofewbits, 5800); 724 787 //XXX: some heuristic to determine initial quantizers will reduce search time 725 788 //determine zero bands and upper limits 726 789 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { 727 790 for (g = 0; g < sce->ics.num_swb; g++) { 728 791 int nz = 0; 729 float uplim = 0.0f; 792 float uplim = INFINITY; 793 float energy = 0.0f; 730 794 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { 731 795 FFPsyBand *band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g]; 732 uplim += band->threshold; 733 if (band->energy <= band->threshold || band->threshold == 0.0f) { 796 if (band->energy <= band->threshold * zeroscale || band->threshold == 0.0f) { 734 797 sce->zeroes[(w+w2)*16+g] = 1; 735 798 continue; 736 799 } 800 if (uplim > band->threshold) { 801 uplim = band->threshold; 802 energy = band->energy; 803 } 737 804 nz = 1; 738 805 } 739 uplims[w*16+g] = uplim *512; 806 if (!nz) 807 uplim = 0.0f; 808 uplims[w*16+g] = uplim; 809 energies[w*16+g] = energy; 740 810 sce->zeroes[w*16+g] = !nz; 741 if (nz)742 minthr = FFMIN(minthr, uplim);743 811 allz |= nz; 744 812 } 745 813 } 814 815 /* Compute initial scalers */ 816 minscaler = 65535; 746 817 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { 747 818 for (g = 0; g < sce->ics.num_swb; g++) { 748 819 if (sce->zeroes[w*16+g]) { 749 820 sce->sf_idx[w*16+g] = SCALE_ONE_POS; 750 821 continue; 751 822 } 752 sce->sf_idx[w*16+g] = SCALE_ONE_POS + FFMIN(log2f(uplims[w*16+g]/minthr)*4,59); 823 /* log2f-to-distortion ratio is, technically, 2 (1.5db = 4, but it's power vs level so it's 2). 824 * But, as offsets are applied, low-frequency signals are too sensitive to the induced distortion, 825 * so we make scaling more conservative by choosing a lower log2f-to-distortion ratio, and thus 826 * more robust. 827 */ 828 sce->sf_idx[w*16+g] = SCALE_ONE_POS + 1.75*log2f(FFMAX(0.125f,uplims[w*16+g])) + sfoffs; 829 minscaler = FFMIN(minscaler, sce->sf_idx[w*16+g]); 753 830 } 754 831 } 755 832 833 /* Clip */ 834 minscaler = av_clip(minscaler, SCALE_ONE_POS - SCALE_DIV_512, SCALE_MAX_POS - SCALE_DIV_512); 835 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) 836 for (g = 0; g < sce->ics.num_swb; g++) 837 if (!sce->zeroes[w*16+g]) 838 sce->sf_idx[w*16+g] = av_clip(sce->sf_idx[w*16+g], minscaler, minscaler + SCALE_MAX_DIFF - 1); 839 756 840 if (!allz) 757 841 return; 758 842 abs_pow34_v(s->scoefs, sce->coeffs, 1024); … … static void search_for_quantizers_twoloop(AVCodecContext *avctx, 766 850 } 767 851 } 768 852 853 /* Scale uplims to match rate distortion to quality 854 * and apply noisy band depriorization. 855 * Maxval-energy ratio gives us an idea of how noisy the band is. 856 * If maxval^2 ~ energy, then that band is mostly noise, and we can relax 857 * rate distortion requirements. 858 */ 859 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { 860 start = w*128; 861 for (g = 0; g < sce->ics.num_swb; g++) { 862 float max = find_max_absval(sce->ics.group_len[w], sce->ics.swb_sizes[g], sce->coeffs + start); 863 if (max > 0) { 864 float energy2uplim = energies[w*16+g] / (max*max*sce->ics.swb_sizes[g]); 865 energy2uplim = FFMAX(0.0625f, FFMIN(1.0f,energy2uplim)); 866 uplims[w*16+g] *= av_clipf(rdlambda * rdlambda * energy2uplim, 0.0625f, rdmax); 867 start += sce->ics.swb_sizes[g]; 868 } 869 } 870 } 871 769 872 //perform two-loop search 770 873 //outer loop - improve quality 771 874 do { 772 int tbits, qstep; 773 minscaler = sce->sf_idx[0]; 875 int qstep; 774 876 //inner loop - quantize spectrum to fit into given number of bits 775 877 qstep = its ? 1 : 32; 776 878 do { … … static void search_for_quantizers_twoloop(AVCodecContext *avctx, 790 892 start += sce->ics.swb_sizes[g]; 791 893 continue; 792 894 } 793 minscaler = FFMIN(minscaler, sce->sf_idx[w*16+g]);794 895 cb = find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]); 795 896 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { 796 897 int b; … … static void search_for_quantizers_twoloop(AVCodecContext *avctx, 813 914 prev = sce->sf_idx[w*16+g]; 814 915 } 815 916 } 816 if (tbits > destbits) {917 if (tbits > toomanybits) { 817 918 for (i = 0; i < 128; i++) 818 if (sce->sf_idx[i] < 218 - qstep)819 sce->sf_idx[i] += qstep;820 } else {919 if (sce->sf_idx[i] < (SCALE_MAX_POS - SCALE_DIV_512)) 920 sce->sf_idx[i] = FFMIN(SCALE_MAX_POS, sce->sf_idx[i] + qstep); 921 } else if (tbits < toofewbits) { 821 922 for (i = 0; i < 128; i++) 822 if (sce->sf_idx[i] > 60 - qstep)823 sce->sf_idx[i] -= qstep;923 if (sce->sf_idx[i] > SCALE_ONE_POS) 924 sce->sf_idx[i] = FFMAX(SCALE_ONE_POS, sce->sf_idx[i] - qstep); 824 925 } 825 926 qstep >>= 1; 826 if (!qstep && tbits > destbits*1.02&& sce->sf_idx[0] < 217)927 if (!qstep && tbits > toomanybits && sce->sf_idx[0] < 217) 827 928 qstep = 1; 828 929 } while (qstep); 829 930 931 minscaler = SCALE_MAX_POS; 932 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) 933 for (g = 0; g < sce->ics.num_swb; g++) 934 if (!sce->zeroes[w*16+g]) 935 minscaler = FFMIN(minscaler, sce->sf_idx[w*16+g]); 936 830 937 fflag = 0; 831 minscaler = av_clip(minscaler, 60, 255 - SCALE_MAX_DIFF); 938 minscaler = nminscaler = av_clip(minscaler, SCALE_ONE_POS - SCALE_DIV_512, SCALE_MAX_POS - SCALE_DIV_512); 939 minrdsf = (avctx->flags & CODEC_FLAG_QSCALE) ? 60 : minscaler; 832 940 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { 833 941 for (g = 0; g < sce->ics.num_swb; g++) { 834 942 int prevsc = sce->sf_idx[w*16+g]; 835 if (dists[w*16+g] > uplims[w*16+g] && sce->sf_idx[w*16+g] > 60) {943 if (dists[w*16+g] > uplims[w*16+g] && sce->sf_idx[w*16+g] > minrdsf) { 836 944 if (find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]-1)) 837 945 sce->sf_idx[w*16+g]--; 838 946 else //Try to make sure there is some energy in every band 839 947 sce->sf_idx[w*16+g]-=2; 840 948 } 841 sce->sf_idx[w*16+g] = av_clip(sce->sf_idx[w*16+g], min scaler, minscaler + SCALE_MAX_DIFF);842 sce->sf_idx[w*16+g] = FFMIN(sce->sf_idx[w*16+g], 219);949 sce->sf_idx[w*16+g] = av_clip(sce->sf_idx[w*16+g], minrdsf, minscaler + SCALE_MAX_DIFF); 950 sce->sf_idx[w*16+g] = FFMIN(sce->sf_idx[w*16+g], SCALE_MAX_POS - SCALE_DIV_512); 843 951 if (sce->sf_idx[w*16+g] != prevsc) 844 952 fflag = 1; 953 nminscaler = FFMIN(nminscaler, sce->sf_idx[w*16+g]); 845 954 sce->band_type[w*16+g] = find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]); 846 955 } 847 956 } 957 if (nminscaler < minscaler) { 958 // Drecreased some scalers below minscaler. Must re-clamp. 959 minscaler = nminscaler; 960 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) 961 for (g = 0; g < sce->ics.num_swb; g++) 962 sce->sf_idx[w*16+g] = av_clip(sce->sf_idx[w*16+g], minscaler, minscaler + SCALE_MAX_DIFF); 963 } 848 964 its++; 849 } while (fflag && its < 10); 965 } while (fflag && its < 20); 966 967 /* Fill implicit zeroes */ 968 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) 969 for (g = 0; g < sce->ics.num_swb; g++) 970 if (sce->band_type[w*16+g] == 0) 971 sce->zeroes[w*16+g] = 1; 850 972 } 851 973 852 974 static void search_for_quantizers_faac(AVCodecContext *avctx, AACEncContext *s, … … static void search_for_quantizers_fast(AVCodecContext *avctx, AACEncContext *s, 1021 1143 SingleChannelElement *sce, 1022 1144 const float lambda) 1023 1145 { 1024 int i, w, w2, g; 1025 int minq = 255; 1146 int w, w2, g; 1147 float lowlambda = av_clipf(120.f / lambda, 0.85f, 1.f); 1148 float rlambda = av_clipf(120.f / lambda, 0.75f, 10.f); 1149 const int minq = av_clip(2 * log2f(120.f / lambda) + 150, 100, 218 - SCALE_MAX_DIFF); 1150 const int maxq = minq + SCALE_MAX_DIFF - 1; 1026 1151 1027 1152 memset(sce->sf_idx, 0, sizeof(sce->sf_idx)); 1028 1153 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { 1029 1154 for (g = 0; g < sce->ics.num_swb; g++) { 1030 1155 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { 1031 1156 FFPsyBand *band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g]; 1032 if (band->energy <= band->threshold) {1033 sce->sf_idx[(w+w2)*16+g] = 218;1157 if (band->energy <= 0.05 * lowlambda * band->threshold) { 1158 sce->sf_idx[(w+w2)*16+g] = maxq; 1034 1159 sce->zeroes[(w+w2)*16+g] = 1; 1035 1160 } else { 1036 sce->sf_idx[(w+w2)*16+g] = av_clip(SCALE_ONE_POS - SCALE_DIV_512 + log2f(band->threshold), 80, 218);1161 sce->sf_idx[(w+w2)*16+g] = av_clip(SCALE_ONE_POS - SCALE_DIV_512 + 1.414*log2f(band->threshold * rlambda), minq, maxq); 1037 1162 sce->zeroes[(w+w2)*16+g] = 0; 1038 1163 } 1039 minq = FFMIN(minq, sce->sf_idx[(w+w2)*16+g]);1040 1164 } 1041 1165 } 1042 1166 } 1043 for (i = 0; i < 128; i++) {1044 sce->sf_idx[i] = 140;1045 //av_clip(sce->sf_idx[i], minq, minq + SCALE_MAX_DIFF - 1);1046 }1047 1167 //set the same quantizers inside window groups 1048 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) 1049 for (g = 0; g < sce->ics.num_swb; g++) 1050 for (w2 = 1; w2 < sce->ics.group_len[w]; w2++) 1051 sce->sf_idx[(w+w2)*16+g] = sce->sf_idx[w*16+g]; 1168 if (sce->ics.num_windows > 1) { 1169 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { 1170 for (g = 0; g < sce->ics.num_swb; g++) { 1171 if (sce->ics.group_len[w] > 1) { 1172 int avg_sf_idx = 0; 1173 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) 1174 avg_sf_idx += sce->sf_idx[w*16+g]; 1175 avg_sf_idx /= sce->ics.group_len[w]; 1176 for (w2 = 1; w2 < sce->ics.group_len[w]; w2++) 1177 sce->sf_idx[(w+w2)*16+g] = avg_sf_idx; 1178 } 1179 } 1180 } 1181 } 1182 } 1183 1184 static float bval2bmax(float b) 1185 { 1186 /* approximates exp10f(-3.0f*(0.5f + 0.5f * cosf(FFMIN(b,15.5f) / 15.5f))) */ 1187 return 0.001f + 0.0035f * (b*b*b) / (15.5f*15.5f*15.5f); 1052 1188 } 1053 1189 1054 1190 static void search_for_ms(AACEncContext *s, ChannelElement *cpe, … … static void search_for_ms(AACEncContext *s, ChannelElement *cpe, 1059 1195 float *L34 = s->scoefs, *R34 = s->scoefs + 128, *M34 = s->scoefs + 128*2, *S34 = s->scoefs + 128*3; 1060 1196 SingleChannelElement *sce0 = &cpe->ch[0]; 1061 1197 SingleChannelElement *sce1 = &cpe->ch[1]; 1198 1062 1199 if (!cpe->common_window) 1063 1200 return; 1201 1064 1202 for (w = 0; w < sce0->ics.num_windows; w += sce0->ics.group_len[w]) { 1203 int min_sf_idx_mid = SCALE_MAX_POS; 1204 int min_sf_idx_side = SCALE_MAX_POS; 1205 for (g = 0; g < sce0->ics.num_swb; g++) { 1206 if (!sce0->zeroes[w*16+g]) 1207 min_sf_idx_mid = FFMIN(min_sf_idx_mid, sce0->sf_idx[w*16+g]); 1208 if (!sce1->zeroes[w*16+g]) 1209 min_sf_idx_side = FFMIN(min_sf_idx_side, sce1->sf_idx[w*16+g]); 1210 } 1211 1065 1212 for (g = 0; g < sce0->ics.num_swb; g++) { 1213 float bmax = bval2bmax(g * 17.0f / sce0->ics.num_swb) / 0.0045f; 1066 1214 if (!cpe->ch[0].zeroes[w*16+g] && !cpe->ch[1].zeroes[w*16+g]) { 1067 1215 float dist1 = 0.0f, dist2 = 0.0f; 1216 int B0 = 0, B1 = 0; 1217 int minidx; 1218 int mididx, sididx; 1219 float Mmax = 0.0f, Smax = 0.0f; 1220 int midcb, sidcb; 1221 1222 /* Must compute mid/side SF and book for the whole window group */ 1223 minidx = FFMIN(sce0->sf_idx[w*16+g], sce1->sf_idx[w*16+g]); 1224 for (w2 = 0; w2 < sce0->ics.group_len[w]; w2++) { 1225 for (i = 0; i < sce0->ics.swb_sizes[g]; i++) { 1226 M[i] = (sce0->coeffs[start+w2*128+i] 1227 + sce1->coeffs[start+w2*128+i]) * 0.5; 1228 S[i] = M[i] 1229 - sce1->coeffs[start+w2*128+i]; 1230 } 1231 abs_pow34_v(M34, M, sce0->ics.swb_sizes[g]); 1232 abs_pow34_v(S34, S, sce0->ics.swb_sizes[g]); 1233 for (i = 0; i < sce0->ics.swb_sizes[g]; i++ ) { 1234 Mmax = FFMAX(Mmax, M34[i]); 1235 Smax = FFMAX(Smax, S34[i]); 1236 } 1237 } 1238 mididx = av_clip(minidx, min_sf_idx_mid, min_sf_idx_mid + SCALE_MAX_DIFF); 1239 sididx = av_clip(minidx, min_sf_idx_side, min_sf_idx_side + SCALE_MAX_DIFF); 1240 midcb = find_min_book(Mmax, mididx); 1241 sidcb = find_min_book(Smax, sididx); 1242 1068 1243 for (w2 = 0; w2 < sce0->ics.group_len[w]; w2++) { 1069 1244 FFPsyBand *band0 = &s->psy.ch[s->cur_channel+0].psy_bands[(w+w2)*16+g]; 1070 1245 FFPsyBand *band1 = &s->psy.ch[s->cur_channel+1].psy_bands[(w+w2)*16+g]; 1071 1246 float minthr = FFMIN(band0->threshold, band1->threshold); 1072 float maxthr = FFMAX(band0->threshold, band1->threshold);1247 int b1,b2,b3,b4; 1073 1248 for (i = 0; i < sce0->ics.swb_sizes[g]; i++) { 1074 1249 M[i] = (sce0->coeffs[start+w2*128+i] 1075 1250 + sce1->coeffs[start+w2*128+i]) * 0.5; … … static void search_for_ms(AACEncContext *s, ChannelElement *cpe, 1085 1260 sce0->ics.swb_sizes[g], 1086 1261 sce0->sf_idx[(w+w2)*16+g], 1087 1262 sce0->band_type[(w+w2)*16+g], 1088 lambda / band0->threshold, INFINITY, NULL);1263 lambda / band0->threshold, INFINITY, &b1); 1089 1264 dist1 += quantize_band_cost(s, sce1->coeffs + start + w2*128, 1090 1265 R34, 1091 1266 sce1->ics.swb_sizes[g], 1092 1267 sce1->sf_idx[(w+w2)*16+g], 1093 1268 sce1->band_type[(w+w2)*16+g], 1094 lambda / band1->threshold, INFINITY, NULL);1269 lambda / band1->threshold, INFINITY, &b2); 1095 1270 dist2 += quantize_band_cost(s, M, 1096 1271 M34, 1097 1272 sce0->ics.swb_sizes[g], 1098 sce0->sf_idx[(w+w2)*16+g],1099 sce0->band_type[(w+w2)*16+g],1100 lambda / m axthr, INFINITY, NULL);1273 mididx, 1274 midcb, 1275 lambda / minthr, INFINITY, &b3); 1101 1276 dist2 += quantize_band_cost(s, S, 1102 1277 S34, 1103 1278 sce1->ics.swb_sizes[g], 1104 sce1->sf_idx[(w+w2)*16+g], 1105 sce1->band_type[(w+w2)*16+g], 1106 lambda / minthr, INFINITY, NULL); 1279 sididx, 1280 sidcb, 1281 lambda * (lambda / 120.0f) / (minthr * bmax), INFINITY, &b4); 1282 B0 += b1+b2; 1283 B1 += b3+b4; 1284 dist1 -= B0; 1285 dist2 -= B1; 1107 1286 } 1108 cpe->ms_mask[w*16+g] = dist2 < dist1; 1287 cpe->ms_mask[w*16+g] = dist2 <= dist1 && B1 < B0; 1288 if (cpe->ms_mask[w*16+g]) { 1289 for (w2 = 0; w2 < sce0->ics.group_len[w]; w2++) { 1290 sce0->sf_idx[(w+w2)*16+g] = mididx; 1291 sce0->band_type[(w+w2)*16+g] = midcb; 1292 sce1->sf_idx[(w+w2)*16+g] = sididx; 1293 sce1->band_type[(w+w2)*16+g] = sidcb; 1294 } 1295 } 1296 } else { 1297 cpe->ms_mask[w*16+g] = 0; 1109 1298 } 1110 1299 start += sce0->ics.swb_sizes[g]; 1111 1300 } -
libavcodec/aacenc.c
diff --git a/libavcodec/aacenc.c b/libavcodec/aacenc.c index 362f02b..eebdab1 100644
a b static void adjust_frame_information(ChannelElement *cpe, int chans) 317 317 if (cpe->common_window && !ch && cpe->ms_mask[w + g]) { 318 318 for (i = 0; i < ics->swb_sizes[g]; i++) { 319 319 cpe->ch[0].coeffs[start+i] = (cpe->ch[0].coeffs[start+i] + cpe->ch[1].coeffs[start+i]) / 2.0; 320 cpe->ch[1].coeffs[start+i] = cpe->ch[0].coeffs[start+i] - cpe->ch[1].coeffs[start+i];320 cpe->ch[1].coeffs[start+i] = cpe->ch[0].coeffs[start+i] - cpe->ch[1].coeffs[start+i]; 321 321 } 322 322 } 323 323 start += ics->swb_sizes[g]; … … static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, 507 507 AACEncContext *s = avctx->priv_data; 508 508 float **samples = s->planar_samples, *samples2, *la, *overlap; 509 509 ChannelElement *cpe; 510 int i, ch, w, g, chans, tag, start_ch, ret ;510 int i, ch, w, g, chans, tag, start_ch, ret, frame_bits, its; 511 511 int chan_el_counter[4]; 512 512 FFPsyWindowInfo windows[AAC_MAX_CHANNELS]; 513 513 … … static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, 572 572 } 573 573 if ((ret = ff_alloc_packet2(avctx, avpkt, 8192 * s->channels)) < 0) 574 574 return ret; 575 576 frame_bits = 0; 577 its = 0; 575 578 do { 576 int frame_bits;577 579 int target_bits, too_many_bits, too_few_bits; 580 578 581 init_put_bits(&s->pb, avpkt->data, avpkt->size); 579 582 580 583 if ((avctx->frame_number & 0xFF)==1 && !(avctx->flags & CODEC_FLAG_BITEXACT)) 581 584 put_bitstream_info(s, LIBAVCODEC_IDENT); 582 585 start_ch = 0; 586 target_bits = 0; 583 587 memset(chan_el_counter, 0, sizeof(chan_el_counter)); 584 588 for (i = 0; i < s->chan_map[0]; i++) { 585 589 FFPsyWindowInfo* wi = windows + start_ch; … … static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, 591 595 put_bits(&s->pb, 4, chan_el_counter[tag]++); 592 596 for (ch = 0; ch < chans; ch++) 593 597 coeffs[ch] = cpe->ch[ch].coeffs; 598 s->psy.bitres.alloc = -1; 594 599 s->psy.model->analyze(&s->psy, start_ch, coeffs, wi); 600 target_bits += s->psy.bitres.alloc * (120.f / s->lambda); 595 601 for (ch = 0; ch < chans; ch++) { 596 602 s->cur_channel = start_ch + ch; 597 603 s->coder->search_for_quantizers(avctx, s, &cpe->ch[ch], s->lambda); … … static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, 635 641 start_ch += chans; 636 642 } 637 643 644 if (avctx->flags & CODEC_FLAG_QSCALE) { 645 // When using a constant Q-scale, don't mess with lambda 646 break; 647 } 648 649 // rate control stuff 650 // target either the nominal bitrate, or what psy's bit reservoir says to target 651 // whichever is greatest 638 652 frame_bits = put_bits_count(&s->pb); 639 if (frame_bits <= 6144 * s->channels - 3) { 640 s->psy.bitres.bits = frame_bits / s->channels; 653 target_bits = FFMAX(target_bits, avctx->bit_rate * 1024 / avctx->sample_rate); 654 target_bits = FFMIN(target_bits, 6144 * s->channels - 3); 655 656 // When using ABR, be strict (but only for increasing) 657 too_many_bits = target_bits + target_bits/2; 658 too_few_bits = target_bits - target_bits/8; 659 660 if ( its == 0 /* for steady-state Q-scale tracking */ 661 || (its < 5 && (frame_bits < too_few_bits || frame_bits > too_many_bits)) 662 || frame_bits >= 6144 * s->channels - 3 ) 663 { 664 float prev_lambda = s->lambda; 665 float ratio = ((float)target_bits) / frame_bits; 666 s->lambda = FFMIN(s->lambda * ratio, 65536.f); 667 668 if (prev_lambda == s->lambda) 669 break; 670 671 // Keep iterating if we must reduce and lambda is in the sky 672 if (ratio > 0.9f || s->lambda <= 300.f) 673 its++; 674 675 if (frame_bits >= too_few_bits && frame_bits <= too_many_bits) { 676 /* 677 This path is for steady-state Q-scale tracking 678 When frame bits fall within the stable range, we still need to adjust 679 lambda to maintain it like so in a stable fashion (large jumps in lambda 680 create artifacts and shoulda be avoided) 681 */ 682 break; 683 } 684 } else { 641 685 break; 642 686 } 643 644 s->lambda *= avctx->bit_rate * 1024.0f / avctx->sample_rate / frame_bits;645 646 687 } while (1); 647 688 648 689 put_bits(&s->pb, 3, TYPE_END); 649 690 flush_put_bits(&s->pb); 650 691 avctx->frame_bits = put_bits_count(&s->pb); 651 652 // rate control stuff 653 if (!(avctx->flags & CODEC_FLAG_QSCALE)) { 654 float ratio = avctx->bit_rate * 1024.0f / avctx->sample_rate / avctx->frame_bits; 655 s->lambda *= ratio; 656 s->lambda = FFMIN(s->lambda, 65536.f); 657 } 692 s->psy.bitres.bits = avctx->frame_bits / s->channels; 658 693 659 694 if (!frame) 660 695 s->last_frame++; -
libavcodec/aacpsy.c
diff --git a/libavcodec/aacpsy.c b/libavcodec/aacpsy.c index d2a782e..98af667 100644
a b 24 24 * AAC encoder psychoacoustic model 25 25 */ 26 26 27 #include "libavutil/attributes.h"28 27 #include "libavutil/libm.h" 29 28 30 29 #include "avcodec.h" … … static float lame_calc_attack_threshold(int bitrate) 255 254 /** 256 255 * LAME psy model specific initialization 257 256 */ 258 static av_cold void lame_window_init(AacPsyContext *ctx, AVCodecContext *avctx) 259 { 257 static void lame_window_init(AacPsyContext *ctx, AVCodecContext *avctx) { 260 258 int i, j; 261 259 262 260 for (i = 0; i < avctx->channels; i++) { … … static av_cold int psy_3gpp_init(FFPsyContext *ctx) { 299 297 float bark; 300 298 int i, j, g, start; 301 299 float prev, minscale, minath, minsnr, pe_min; 302 const int chan_bitrate = ctx->avctx->bit_rate / ctx->avctx->channels;300 const int chan_bitrate = ctx->avctx->bit_rate / ((ctx->avctx->flags & CODEC_FLAG_QSCALE) ? 2.0f : ctx->avctx->channels); 303 301 const int bandwidth = ctx->avctx->cutoff ? ctx->avctx->cutoff : AAC_CUTOFF(ctx->avctx); 304 302 const float num_bark = calc_bark((float)bandwidth); 305 303 … … static av_unused FFPsyWindowInfo psy_3gpp_window(FFPsyContext *ctx, 391 389 int channel, int prev_type) 392 390 { 393 391 int i, j; 394 int br = ctx->avctx->bit_rate / ctx->avctx->channels;392 int br = ((AacPsyContext*)ctx->model_priv_data)->chan_bitrate; 395 393 int attack_ratio = br <= 16000 ? 18 : 10; 396 394 AacPsyContext *pctx = (AacPsyContext*) ctx->model_priv_data; 397 395 AacPsyChannel *pch = &pctx->ch[channel]; … … static void psy_3gpp_analyze_channel(FFPsyContext *ctx, int channel, 681 679 desired_pe *= av_clipf(pctx->pe.previous / PSY_3GPP_BITS_TO_PE(ctx->bitres.bits), 682 680 0.85f, 1.15f); 683 681 pctx->pe.previous = PSY_3GPP_BITS_TO_PE(desired_bits); 682 ctx->bitres.alloc = desired_bits; 684 683 685 684 if (desired_pe < pe) { 686 685 /* 5.6.1.3.4 "First Estimation of the reduction value" */ -
libavcodec/psymodel.h
diff --git a/libavcodec/psymodel.h b/libavcodec/psymodel.h index d1a126a..c446ceb 100644
a b typedef struct FFPsyContext { 88 88 struct { 89 89 int size; ///< size of the bitresevoir in bits 90 90 int bits; ///< number of bits used in the bitresevoir 91 int alloc; ///< number of bits allocated by the psy, or -1 if no allocation was done 91 92 } bitres; 92 93 93 94 void* model_priv_data; ///< psychoacoustic model implementation private data
