comparison aaccoder.c @ 11731:73f923159384 libavcodec

aacenc: Use exact values when quantizing, not fuzzy values. This requires us to code small escapes; we can't avoid it.
author alexc
date Fri, 14 May 2010 16:49:40 +0000
parents 5e8702ddbb93
children c40cc26cd23f
comparison
equal deleted inserted replaced
11730:5e8702ddbb93 11731:73f923159384
63 { 63 {
64 float a = coef * Q; 64 float a = coef * Q;
65 return sqrtf(a * sqrtf(a)) + 0.4054; 65 return sqrtf(a * sqrtf(a)) + 0.4054;
66 } 66 }
67 67
68 static void quantize_bands(int (*out)[2], const float *in, const float *scaled, 68 static void quantize_bands(int *out, const float *in, const float *scaled,
69 int size, float Q34, int is_signed, int maxval) 69 int size, float Q34, int is_signed, int maxval)
70 { 70 {
71 int i; 71 int i;
72 double qc; 72 double qc;
73 for (i = 0; i < size; i++) { 73 for (i = 0; i < size; i++) {
74 qc = scaled[i] * Q34; 74 qc = scaled[i] * Q34;
75 out[i][0] = (int)FFMIN(qc, (double)maxval); 75 out[i] = (int)FFMIN(qc + 0.4054, (double)maxval);
76 out[i][1] = (int)FFMIN(qc + 0.4054, (double)maxval);
77 if (is_signed && in[i] < 0.0f) { 76 if (is_signed && in[i] < 0.0f) {
78 out[i][0] = -out[i][0]; 77 out[i] = -out[i];
79 out[i][1] = -out[i][1];
80 } 78 }
81 } 79 }
82 } 80 }
83 81
84 static void abs_pow34_v(float *out, const float *in, const int size) 82 static void abs_pow34_v(float *out, const float *in, const int size)
111 const float CLIPPED_ESCAPE = 165140.0f*IQ; 109 const float CLIPPED_ESCAPE = 165140.0f*IQ;
112 int i, j, k; 110 int i, j, k;
113 float cost = 0; 111 float cost = 0;
114 const int dim = cb < FIRST_PAIR_BT ? 4 : 2; 112 const int dim = cb < FIRST_PAIR_BT ? 4 : 2;
115 int resbits = 0; 113 int resbits = 0;
116 #ifndef USE_REALLY_FULL_SEARCH
117 const float Q34 = sqrtf(Q * sqrtf(Q)); 114 const float Q34 = sqrtf(Q * sqrtf(Q));
118 const int range = aac_cb_range[cb]; 115 const int range = aac_cb_range[cb];
119 const int maxval = aac_cb_maxval[cb]; 116 const int maxval = aac_cb_maxval[cb];
120 int offs[4]; 117 int off;
121 #endif /* USE_REALLY_FULL_SEARCH */
122 118
123 if (!cb) { 119 if (!cb) {
124 for (i = 0; i < size; i++) 120 for (i = 0; i < size; i++)
125 cost += in[i]*in[i]; 121 cost += in[i]*in[i];
126 if (bits) 122 if (bits)
127 *bits = 0; 123 *bits = 0;
128 return cost * lambda; 124 return cost * lambda;
129 } 125 }
130 #ifndef USE_REALLY_FULL_SEARCH
131 offs[0] = 1;
132 for (i = 1; i < dim; i++)
133 offs[i] = offs[i-1]*range;
134 if (!scaled) { 126 if (!scaled) {
135 abs_pow34_v(s->scoefs, in, size); 127 abs_pow34_v(s->scoefs, in, size);
136 scaled = s->scoefs; 128 scaled = s->scoefs;
137 } 129 }
138 quantize_bands(s->qcoefs, in, scaled, size, Q34, !IS_CODEBOOK_UNSIGNED(cb), maxval); 130 quantize_bands(s->qcoefs, in, scaled, size, Q34, !IS_CODEBOOK_UNSIGNED(cb), maxval);
139 #endif /* USE_REALLY_FULL_SEARCH */ 131 if (IS_CODEBOOK_UNSIGNED(cb)) {
132 off = 0;
133 } else {
134 off = maxval;
135 }
140 for (i = 0; i < size; i += dim) { 136 for (i = 0; i < size; i += dim) {
141 float mincost;
142 int minidx = 0;
143 int minbits = 0;
144 const float *vec; 137 const float *vec;
145 #ifndef USE_REALLY_FULL_SEARCH 138 int *quants = s->qcoefs + i;
146 int (*quants)[2] = &s->qcoefs[i]; 139 int curidx = 0;
147 mincost = 0.0f; 140 int curbits;
148 for (j = 0; j < dim; j++) 141 float rd = 0.0f;
149 mincost += in[i+j]*in[i+j]; 142 for (j = 0; j < dim; j++) {
150 minidx = IS_CODEBOOK_UNSIGNED(cb) ? 0 : 40; 143 curidx *= range;
151 minbits = ff_aac_spectral_bits[cb-1][minidx]; 144 curidx += quants[j] + off;
152 mincost = mincost * lambda + minbits; 145 }
153 for (j = 0; j < (1<<dim); j++) {
154 float rd = 0.0f;
155 int curbits;
156 int curidx = IS_CODEBOOK_UNSIGNED(cb) ? 0 : 40;
157 int same = 0;
158 for (k = 0; k < dim; k++) {
159 if ((j & (1 << k)) && quants[k][0] == quants[k][1]) {
160 same = 1;
161 break;
162 }
163 }
164 if (same)
165 continue;
166 for (k = 0; k < dim; k++)
167 curidx += quants[k][!!(j & (1 << k))] * offs[dim - 1 - k];
168 curbits = ff_aac_spectral_bits[cb-1][curidx]; 146 curbits = ff_aac_spectral_bits[cb-1][curidx];
169 vec = &ff_aac_codebook_vectors[cb-1][curidx*dim]; 147 vec = &ff_aac_codebook_vectors[cb-1][curidx*dim];
170 #else
171 mincost = INFINITY;
172 vec = ff_aac_codebook_vectors[cb-1];
173 for (j = 0; j < ff_aac_spectral_sizes[cb-1]; j++, vec += dim) {
174 float rd = 0.0f;
175 int curbits = ff_aac_spectral_bits[cb-1][j];
176 int curidx = j;
177 #endif /* USE_REALLY_FULL_SEARCH */
178 if (IS_CODEBOOK_UNSIGNED(cb)) { 148 if (IS_CODEBOOK_UNSIGNED(cb)) {
179 for (k = 0; k < dim; k++) { 149 for (k = 0; k < dim; k++) {
180 float t = fabsf(in[i+k]); 150 float t = fabsf(in[i+k]);
181 float di; 151 float di;
182 if (vec[k] == 64.0f) { //FIXME: slow 152 if (vec[k] == 64.0f) { //FIXME: slow
183 //do not code with escape sequence small values
184 if (t < 39.0f*IQ) {
185 rd = INFINITY;
186 break;
187 }
188 if (t >= CLIPPED_ESCAPE) { 153 if (t >= CLIPPED_ESCAPE) {
189 di = t - CLIPPED_ESCAPE; 154 di = t - CLIPPED_ESCAPE;
190 curbits += 21; 155 curbits += 21;
191 } else { 156 } else {
192 int c = av_clip(quant(t, Q), 0, 8191); 157 int c = av_clip(quant(t, Q), 0, 8191);
204 for (k = 0; k < dim; k++) { 169 for (k = 0; k < dim; k++) {
205 float di = in[i+k] - vec[k]*IQ; 170 float di = in[i+k] - vec[k]*IQ;
206 rd += di*di; 171 rd += di*di;
207 } 172 }
208 } 173 }
209 rd = rd * lambda + curbits; 174 cost += rd * lambda + curbits;
210 if (rd < mincost) { 175 resbits += curbits;
211 mincost = rd;
212 minidx = curidx;
213 minbits = curbits;
214 }
215 }
216 cost += mincost;
217 resbits += minbits;
218 if (cost >= uplim) 176 if (cost >= uplim)
219 return uplim; 177 return uplim;
220 if (pb) { 178 if (pb) {
221 put_bits(pb, ff_aac_spectral_bits[cb-1][minidx], ff_aac_spectral_codes[cb-1][minidx]); 179 put_bits(pb, ff_aac_spectral_bits[cb-1][curidx], ff_aac_spectral_codes[cb-1][curidx]);
222 if (IS_CODEBOOK_UNSIGNED(cb)) 180 if (IS_CODEBOOK_UNSIGNED(cb))
223 for (j = 0; j < dim; j++) 181 for (j = 0; j < dim; j++)
224 if (ff_aac_codebook_vectors[cb-1][minidx*dim+j] != 0.0f) 182 if (ff_aac_codebook_vectors[cb-1][curidx*dim+j] != 0.0f)
225 put_bits(pb, 1, in[i+j] < 0.0f); 183 put_bits(pb, 1, in[i+j] < 0.0f);
226 if (cb == ESC_BT) { 184 if (cb == ESC_BT) {
227 for (j = 0; j < 2; j++) { 185 for (j = 0; j < 2; j++) {
228 if (ff_aac_codebook_vectors[cb-1][minidx*2+j] == 64.0f) { 186 if (ff_aac_codebook_vectors[cb-1][curidx*2+j] == 64.0f) {
229 int coef = av_clip(quant(fabsf(in[i+j]), Q), 0, 8191); 187 int coef = av_clip(quant(fabsf(in[i+j]), Q), 0, 8191);
230 int len = av_log2(coef); 188 int len = av_log2(coef);
231 189
232 put_bits(pb, len - 4 + 1, (1 << (len - 4 + 1)) - 2); 190 put_bits(pb, len - 4 + 1, (1 << (len - 4 + 1)) - 2);
233 put_bits(pb, len, coef & ((1 << len) - 1)); 191 put_bits(pb, len, coef & ((1 << len) - 1));