Mercurial > libavcodec.hg
comparison aaccoder.c @ 12178:b3c39e9d4d3e libavcodec
aacenc: Template quantize_and_encode_band_cost().
author | alexc |
---|---|
date | Fri, 16 Jul 2010 20:02:46 +0000 |
parents | 081702713f47 |
children | fca82e8683d4 |
comparison
equal
deleted
inserted
replaced
12177:a39530f3dc94 | 12178:b3c39e9d4d3e |
---|---|
97 /** | 97 /** |
98 * Calculate rate distortion cost for quantizing with given codebook | 98 * Calculate rate distortion cost for quantizing with given codebook |
99 * | 99 * |
100 * @return quantization distortion | 100 * @return quantization distortion |
101 */ | 101 */ |
102 static float quantize_and_encode_band_cost(struct AACEncContext *s, | 102 static av_always_inline float quantize_and_encode_band_cost_template( |
103 struct AACEncContext *s, | |
103 PutBitContext *pb, const float *in, | 104 PutBitContext *pb, const float *in, |
104 const float *scaled, int size, int scale_idx, | 105 const float *scaled, int size, int scale_idx, |
105 int cb, const float lambda, const float uplim, | 106 int cb, const float lambda, const float uplim, |
106 int *bits) | 107 int *bits, int BT_ZERO, int BT_UNSIGNED, |
108 int BT_PAIR, int BT_ESC) | |
107 { | 109 { |
108 const float IQ = ff_aac_pow2sf_tab[200 + scale_idx - SCALE_ONE_POS + SCALE_DIV_512]; | 110 const float IQ = ff_aac_pow2sf_tab[200 + scale_idx - SCALE_ONE_POS + SCALE_DIV_512]; |
109 const float Q = ff_aac_pow2sf_tab[200 - scale_idx + SCALE_ONE_POS - SCALE_DIV_512]; | 111 const float Q = ff_aac_pow2sf_tab[200 - scale_idx + SCALE_ONE_POS - SCALE_DIV_512]; |
110 const float CLIPPED_ESCAPE = 165140.0f*IQ; | 112 const float CLIPPED_ESCAPE = 165140.0f*IQ; |
111 int i, j, k; | 113 int i, j, k; |
112 float cost = 0; | 114 float cost = 0; |
113 const int dim = cb < FIRST_PAIR_BT ? 4 : 2; | 115 const int dim = BT_PAIR ? 2 : 4; |
114 int resbits = 0; | 116 int resbits = 0; |
115 const float Q34 = sqrtf(Q * sqrtf(Q)); | 117 const float Q34 = sqrtf(Q * sqrtf(Q)); |
116 const int range = aac_cb_range[cb]; | 118 const int range = aac_cb_range[cb]; |
117 const int maxval = aac_cb_maxval[cb]; | 119 const int maxval = aac_cb_maxval[cb]; |
118 int off; | 120 int off; |
119 | 121 |
120 if (!cb) { | 122 if (BT_ZERO) { |
121 for (i = 0; i < size; i++) | 123 for (i = 0; i < size; i++) |
122 cost += in[i]*in[i]; | 124 cost += in[i]*in[i]; |
123 if (bits) | 125 if (bits) |
124 *bits = 0; | 126 *bits = 0; |
125 return cost * lambda; | 127 return cost * lambda; |
126 } | 128 } |
127 if (!scaled) { | 129 if (!scaled) { |
128 abs_pow34_v(s->scoefs, in, size); | 130 abs_pow34_v(s->scoefs, in, size); |
129 scaled = s->scoefs; | 131 scaled = s->scoefs; |
130 } | 132 } |
131 quantize_bands(s->qcoefs, in, scaled, size, Q34, !IS_CODEBOOK_UNSIGNED(cb), maxval); | 133 quantize_bands(s->qcoefs, in, scaled, size, Q34, !BT_UNSIGNED, maxval); |
132 if (IS_CODEBOOK_UNSIGNED(cb)) { | 134 if (BT_UNSIGNED) { |
133 off = 0; | 135 off = 0; |
134 } else { | 136 } else { |
135 off = maxval; | 137 off = maxval; |
136 } | 138 } |
137 for (i = 0; i < size; i += dim) { | 139 for (i = 0; i < size; i += dim) { |
144 curidx *= range; | 146 curidx *= range; |
145 curidx += quants[j] + off; | 147 curidx += quants[j] + off; |
146 } | 148 } |
147 curbits = ff_aac_spectral_bits[cb-1][curidx]; | 149 curbits = ff_aac_spectral_bits[cb-1][curidx]; |
148 vec = &ff_aac_codebook_vectors[cb-1][curidx*dim]; | 150 vec = &ff_aac_codebook_vectors[cb-1][curidx*dim]; |
149 if (IS_CODEBOOK_UNSIGNED(cb)) { | 151 if (BT_UNSIGNED) { |
150 for (k = 0; k < dim; k++) { | 152 for (k = 0; k < dim; k++) { |
151 float t = fabsf(in[i+k]); | 153 float t = fabsf(in[i+k]); |
152 float di; | 154 float di; |
153 if (vec[k] == 64.0f) { //FIXME: slow | 155 if (BT_ESC && vec[k] == 64.0f) { //FIXME: slow |
154 if (t >= CLIPPED_ESCAPE) { | 156 if (t >= CLIPPED_ESCAPE) { |
155 di = t - CLIPPED_ESCAPE; | 157 di = t - CLIPPED_ESCAPE; |
156 curbits += 21; | 158 curbits += 21; |
157 } else { | 159 } else { |
158 int c = av_clip(quant(t, Q), 0, 8191); | 160 int c = av_clip(quant(t, Q), 0, 8191); |
176 resbits += curbits; | 178 resbits += curbits; |
177 if (cost >= uplim) | 179 if (cost >= uplim) |
178 return uplim; | 180 return uplim; |
179 if (pb) { | 181 if (pb) { |
180 put_bits(pb, ff_aac_spectral_bits[cb-1][curidx], ff_aac_spectral_codes[cb-1][curidx]); | 182 put_bits(pb, ff_aac_spectral_bits[cb-1][curidx], ff_aac_spectral_codes[cb-1][curidx]); |
181 if (IS_CODEBOOK_UNSIGNED(cb)) | 183 if (BT_UNSIGNED) |
182 for (j = 0; j < dim; j++) | 184 for (j = 0; j < dim; j++) |
183 if (ff_aac_codebook_vectors[cb-1][curidx*dim+j] != 0.0f) | 185 if (ff_aac_codebook_vectors[cb-1][curidx*dim+j] != 0.0f) |
184 put_bits(pb, 1, in[i+j] < 0.0f); | 186 put_bits(pb, 1, in[i+j] < 0.0f); |
185 if (cb == ESC_BT) { | 187 if (BT_ESC) { |
186 for (j = 0; j < 2; j++) { | 188 for (j = 0; j < 2; j++) { |
187 if (ff_aac_codebook_vectors[cb-1][curidx*2+j] == 64.0f) { | 189 if (ff_aac_codebook_vectors[cb-1][curidx*2+j] == 64.0f) { |
188 int coef = av_clip(quant(fabsf(in[i+j]), Q), 0, 8191); | 190 int coef = av_clip(quant(fabsf(in[i+j]), Q), 0, 8191); |
189 int len = av_log2(coef); | 191 int len = av_log2(coef); |
190 | 192 |
198 | 200 |
199 if (bits) | 201 if (bits) |
200 *bits = resbits; | 202 *bits = resbits; |
201 return cost; | 203 return cost; |
202 } | 204 } |
205 | |
206 #define QUANTIZE_AND_ENCODE_BAND_COST_FUNC(NAME, BT_ZERO, BT_UNSIGNED, BT_PAIR, BT_ESC) \ | |
207 static float quantize_and_encode_band_cost_ ## NAME( \ | |
208 struct AACEncContext *s, \ | |
209 PutBitContext *pb, const float *in, \ | |
210 const float *scaled, int size, int scale_idx, \ | |
211 int cb, const float lambda, const float uplim, \ | |
212 int *bits) { \ | |
213 return quantize_and_encode_band_cost_template( \ | |
214 s, pb, in, scaled, size, scale_idx, \ | |
215 BT_ESC ? ESC_BT : cb, lambda, uplim, bits, \ | |
216 BT_ZERO, BT_UNSIGNED, BT_PAIR, BT_ESC); \ | |
217 } | |
218 | |
219 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(ZERO, 1, 0, 0, 0) | |
220 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(SQUAD, 0, 0, 0, 0) | |
221 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(UQUAD, 0, 1, 0, 0) | |
222 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(SPAIR, 0, 0, 1, 0) | |
223 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(UPAIR, 0, 1, 1, 0) | |
224 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(ESC, 0, 1, 1, 1) | |
225 | |
226 static float (*quantize_and_encode_band_cost_arr[])( | |
227 struct AACEncContext *s, | |
228 PutBitContext *pb, const float *in, | |
229 const float *scaled, int size, int scale_idx, | |
230 int cb, const float lambda, const float uplim, | |
231 int *bits) = { | |
232 quantize_and_encode_band_cost_ZERO, | |
233 quantize_and_encode_band_cost_SQUAD, | |
234 quantize_and_encode_band_cost_SQUAD, | |
235 quantize_and_encode_band_cost_UQUAD, | |
236 quantize_and_encode_band_cost_UQUAD, | |
237 quantize_and_encode_band_cost_SPAIR, | |
238 quantize_and_encode_band_cost_SPAIR, | |
239 quantize_and_encode_band_cost_UPAIR, | |
240 quantize_and_encode_band_cost_UPAIR, | |
241 quantize_and_encode_band_cost_UPAIR, | |
242 quantize_and_encode_band_cost_UPAIR, | |
243 quantize_and_encode_band_cost_ESC, | |
244 }; | |
245 | |
246 #define quantize_and_encode_band_cost( \ | |
247 s, pb, in, scaled, size, scale_idx, cb, \ | |
248 lambda, uplim, bits) \ | |
249 quantize_and_encode_band_cost_arr[cb]( \ | |
250 s, pb, in, scaled, size, scale_idx, cb, \ | |
251 lambda, uplim, bits) | |
252 | |
203 static float quantize_band_cost(struct AACEncContext *s, const float *in, | 253 static float quantize_band_cost(struct AACEncContext *s, const float *in, |
204 const float *scaled, int size, int scale_idx, | 254 const float *scaled, int size, int scale_idx, |
205 int cb, const float lambda, const float uplim, | 255 int cb, const float lambda, const float uplim, |
206 int *bits) | 256 int *bits) |
207 { | 257 { |