Mercurial > libavcodec.hg
comparison aaccoder.c @ 11537:bc0012099ba3 libavcodec
aacenc: Merge quantize_band_cost() with quantize_and_encode_band().
If these two functions aren't matched results may be unexpected.
| author | alexc |
|---|---|
| date | Wed, 24 Mar 2010 17:09:21 +0000 |
| parents | cebf6e3381e0 |
| children | 7dd2a45249a9 |
comparison
equal
deleted
inserted
replaced
| 11536:22ab9663ca4e | 11537:bc0012099ba3 |
|---|---|
| 98 /** | 98 /** |
| 99 * Calculate rate distortion cost for quantizing with given codebook | 99 * Calculate rate distortion cost for quantizing with given codebook |
| 100 * | 100 * |
| 101 * @return quantization distortion | 101 * @return quantization distortion |
| 102 */ | 102 */ |
| 103 static float quantize_band_cost(struct AACEncContext *s, const float *in, | 103 static float quantize_and_encode_band_cost(struct AACEncContext *s, |
| 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) |
| 107 { | 108 { |
| 108 const float IQ = ff_aac_pow2sf_tab[200 + scale_idx - SCALE_ONE_POS + SCALE_DIV_512]; | 109 const float IQ = ff_aac_pow2sf_tab[200 + scale_idx - SCALE_ONE_POS + SCALE_DIV_512]; |
| 128 } | 129 } |
| 129 #ifndef USE_REALLY_FULL_SEARCH | 130 #ifndef USE_REALLY_FULL_SEARCH |
| 130 offs[0] = 1; | 131 offs[0] = 1; |
| 131 for (i = 1; i < dim; i++) | 132 for (i = 1; i < dim; i++) |
| 132 offs[i] = offs[i-1]*range; | 133 offs[i] = offs[i-1]*range; |
| 134 if (!scaled) { | |
| 135 abs_pow34_v(s->scoefs, in, size); | |
| 136 scaled = s->scoefs; | |
| 137 } | |
| 133 quantize_bands(s->qcoefs, in, scaled, size, Q34, !IS_CODEBOOK_UNSIGNED(cb), maxval); | 138 quantize_bands(s->qcoefs, in, scaled, size, Q34, !IS_CODEBOOK_UNSIGNED(cb), maxval); |
| 134 #endif /* USE_REALLY_FULL_SEARCH */ | 139 #endif /* USE_REALLY_FULL_SEARCH */ |
| 135 for (i = 0; i < size; i += dim) { | 140 for (i = 0; i < size; i += dim) { |
| 136 float mincost; | 141 float mincost; |
| 137 int minidx = 0; | 142 int minidx = 0; |
| 166 mincost = INFINITY; | 171 mincost = INFINITY; |
| 167 vec = ff_aac_codebook_vectors[cb-1]; | 172 vec = ff_aac_codebook_vectors[cb-1]; |
| 168 for (j = 0; j < ff_aac_spectral_sizes[cb-1]; j++, vec += dim) { | 173 for (j = 0; j < ff_aac_spectral_sizes[cb-1]; j++, vec += dim) { |
| 169 float rd = 0.0f; | 174 float rd = 0.0f; |
| 170 int curbits = ff_aac_spectral_bits[cb-1][j]; | 175 int curbits = ff_aac_spectral_bits[cb-1][j]; |
| 176 int curidx = j; | |
| 171 #endif /* USE_REALLY_FULL_SEARCH */ | 177 #endif /* USE_REALLY_FULL_SEARCH */ |
| 172 if (IS_CODEBOOK_UNSIGNED(cb)) { | 178 if (IS_CODEBOOK_UNSIGNED(cb)) { |
| 173 for (k = 0; k < dim; k++) { | 179 for (k = 0; k < dim; k++) { |
| 174 float t = fabsf(in[i+k]); | 180 float t = fabsf(in[i+k]); |
| 175 float di; | 181 float di; |
| 201 } | 207 } |
| 202 } | 208 } |
| 203 rd = rd * lambda + curbits; | 209 rd = rd * lambda + curbits; |
| 204 if (rd < mincost) { | 210 if (rd < mincost) { |
| 205 mincost = rd; | 211 mincost = rd; |
| 206 minidx = j; | 212 minidx = curidx; |
| 207 minbits = curbits; | 213 minbits = curbits; |
| 208 } | 214 } |
| 209 } | 215 } |
| 210 cost += mincost; | 216 cost += mincost; |
| 211 resbits += minbits; | 217 resbits += minbits; |
| 212 if (cost >= uplim) | 218 if (cost >= uplim) |
| 213 return uplim; | 219 return uplim; |
| 214 } | 220 if (pb) { |
| 215 | |
| 216 if (bits) | |
| 217 *bits = resbits; | |
| 218 return cost; | |
| 219 } | |
| 220 | |
| 221 static void quantize_and_encode_band(struct AACEncContext *s, PutBitContext *pb, | |
| 222 const float *in, int size, int scale_idx, | |
| 223 int cb, const float lambda) | |
| 224 { | |
| 225 const float IQ = ff_aac_pow2sf_tab[200 + scale_idx - SCALE_ONE_POS + SCALE_DIV_512]; | |
| 226 const float Q = ff_aac_pow2sf_tab[200 - scale_idx + SCALE_ONE_POS - SCALE_DIV_512]; | |
| 227 const float CLIPPED_ESCAPE = 165140.0f*IQ; | |
| 228 const int dim = (cb < FIRST_PAIR_BT) ? 4 : 2; | |
| 229 int i, j, k; | |
| 230 #ifndef USE_REALLY_FULL_SEARCH | |
| 231 const float Q34 = sqrtf(Q * sqrtf(Q)); | |
| 232 const int range = aac_cb_range[cb]; | |
| 233 const int maxval = aac_cb_maxval[cb]; | |
| 234 int offs[4]; | |
| 235 float *scaled = s->scoefs; | |
| 236 #endif /* USE_REALLY_FULL_SEARCH */ | |
| 237 | |
| 238 //START_TIMER | |
| 239 if (!cb) | |
| 240 return; | |
| 241 | |
| 242 #ifndef USE_REALLY_FULL_SEARCH | |
| 243 offs[0] = 1; | |
| 244 for (i = 1; i < dim; i++) | |
| 245 offs[i] = offs[i-1]*range; | |
| 246 abs_pow34_v(scaled, in, size); | |
| 247 quantize_bands(s->qcoefs, in, scaled, size, Q34, !IS_CODEBOOK_UNSIGNED(cb), maxval); | |
| 248 #endif /* USE_REALLY_FULL_SEARCH */ | |
| 249 for (i = 0; i < size; i += dim) { | |
| 250 float mincost; | |
| 251 int minidx = 0; | |
| 252 int minbits = 0; | |
| 253 const float *vec; | |
| 254 #ifndef USE_REALLY_FULL_SEARCH | |
| 255 int (*quants)[2] = &s->qcoefs[i]; | |
| 256 mincost = 0.0f; | |
| 257 for (j = 0; j < dim; j++) | |
| 258 mincost += in[i+j]*in[i+j]; | |
| 259 minidx = IS_CODEBOOK_UNSIGNED(cb) ? 0 : 40; | |
| 260 minbits = ff_aac_spectral_bits[cb-1][minidx]; | |
| 261 mincost = mincost * lambda + minbits; | |
| 262 for (j = 0; j < (1<<dim); j++) { | |
| 263 float rd = 0.0f; | |
| 264 int curbits; | |
| 265 int curidx = IS_CODEBOOK_UNSIGNED(cb) ? 0 : 40; | |
| 266 int same = 0; | |
| 267 for (k = 0; k < dim; k++) { | |
| 268 if ((j & (1 << k)) && quants[k][0] == quants[k][1]) { | |
| 269 same = 1; | |
| 270 break; | |
| 271 } | |
| 272 } | |
| 273 if (same) | |
| 274 continue; | |
| 275 for (k = 0; k < dim; k++) | |
| 276 curidx += quants[k][!!(j & (1 << k))] * offs[dim - 1 - k]; | |
| 277 curbits = ff_aac_spectral_bits[cb-1][curidx]; | |
| 278 vec = &ff_aac_codebook_vectors[cb-1][curidx*dim]; | |
| 279 #else | |
| 280 vec = ff_aac_codebook_vectors[cb-1]; | |
| 281 mincost = INFINITY; | |
| 282 for (j = 0; j < ff_aac_spectral_sizes[cb-1]; j++, vec += dim) { | |
| 283 float rd = 0.0f; | |
| 284 int curbits = ff_aac_spectral_bits[cb-1][j]; | |
| 285 int curidx = j; | |
| 286 #endif /* USE_REALLY_FULL_SEARCH */ | |
| 287 if (IS_CODEBOOK_UNSIGNED(cb)) { | |
| 288 for (k = 0; k < dim; k++) { | |
| 289 float t = fabsf(in[i+k]); | |
| 290 float di; | |
| 291 if (vec[k] == 64.0f) { //FIXME: slow | |
| 292 //do not code with escape sequence small values | |
| 293 if (t < 39.0f*IQ) { | |
| 294 rd = INFINITY; | |
| 295 break; | |
| 296 } | |
| 297 if (t >= CLIPPED_ESCAPE) { | |
| 298 di = t - CLIPPED_ESCAPE; | |
| 299 curbits += 21; | |
| 300 } else { | |
| 301 int c = av_clip(quant(t, Q), 0, 8191); | |
| 302 di = t - c*cbrtf(c)*IQ; | |
| 303 curbits += av_log2(c)*2 - 4 + 1; | |
| 304 } | |
| 305 } else { | |
| 306 di = t - vec[k]*IQ; | |
| 307 } | |
| 308 if (vec[k] != 0.0f) | |
| 309 curbits++; | |
| 310 rd += di*di; | |
| 311 } | |
| 312 } else { | |
| 313 for (k = 0; k < dim; k++) { | |
| 314 float di = in[i+k] - vec[k]*IQ; | |
| 315 rd += di*di; | |
| 316 } | |
| 317 } | |
| 318 rd = rd * lambda + curbits; | |
| 319 if (rd < mincost) { | |
| 320 mincost = rd; | |
| 321 minidx = curidx; | |
| 322 minbits = curbits; | |
| 323 } | |
| 324 } | |
| 325 put_bits(pb, ff_aac_spectral_bits[cb-1][minidx], ff_aac_spectral_codes[cb-1][minidx]); | 221 put_bits(pb, ff_aac_spectral_bits[cb-1][minidx], ff_aac_spectral_codes[cb-1][minidx]); |
| 326 if (IS_CODEBOOK_UNSIGNED(cb)) | 222 if (IS_CODEBOOK_UNSIGNED(cb)) |
| 327 for (j = 0; j < dim; j++) | 223 for (j = 0; j < dim; j++) |
| 328 if (ff_aac_codebook_vectors[cb-1][minidx*dim+j] != 0.0f) | 224 if (ff_aac_codebook_vectors[cb-1][minidx*dim+j] != 0.0f) |
| 329 put_bits(pb, 1, in[i+j] < 0.0f); | 225 put_bits(pb, 1, in[i+j] < 0.0f); |
| 336 put_bits(pb, len - 4 + 1, (1 << (len - 4 + 1)) - 2); | 232 put_bits(pb, len - 4 + 1, (1 << (len - 4 + 1)) - 2); |
| 337 put_bits(pb, len, coef & ((1 << len) - 1)); | 233 put_bits(pb, len, coef & ((1 << len) - 1)); |
| 338 } | 234 } |
| 339 } | 235 } |
| 340 } | 236 } |
| 341 } | 237 } |
| 342 //STOP_TIMER("quantize_and_encode") | 238 } |
| 239 | |
| 240 if (bits) | |
| 241 *bits = resbits; | |
| 242 return cost; | |
| 243 } | |
| 244 static float quantize_band_cost(struct AACEncContext *s, const float *in, | |
| 245 const float *scaled, int size, int scale_idx, | |
| 246 int cb, const float lambda, const float uplim, | |
| 247 int *bits) | |
| 248 { | |
| 249 return quantize_and_encode_band_cost(s, NULL, in, scaled, size, scale_idx, | |
| 250 cb, lambda, uplim, bits); | |
| 251 } | |
| 252 | |
| 253 static void quantize_and_encode_band(struct AACEncContext *s, PutBitContext *pb, | |
| 254 const float *in, int size, int scale_idx, | |
| 255 int cb, const float lambda) | |
| 256 { | |
| 257 quantize_and_encode_band_cost(s, pb, in, NULL, size, scale_idx, cb, lambda, | |
| 258 INFINITY, NULL); | |
| 343 } | 259 } |
| 344 | 260 |
| 345 /** | 261 /** |
| 346 * structure used in optimal codebook search | 262 * structure used in optimal codebook search |
| 347 */ | 263 */ |
