Mercurial > libavcodec.hg
comparison aaccoder.c @ 9937:3e39dbd2d9eb libavcodec
cosmetics: prettyprinting, K&R style, break overly long lines
| author | diego |
|---|---|
| date | Wed, 08 Jul 2009 21:16:06 +0000 |
| parents | 7f42ae22c351 |
| children | 6c1ac45b3097 |
comparison
equal
deleted
inserted
replaced
| 9936:7f42ae22c351 | 9937:3e39dbd2d9eb |
|---|---|
| 47 /** bits needed to code codebook run value for short windows */ | 47 /** bits needed to code codebook run value for short windows */ |
| 48 static const uint8_t run_value_bits_short[16] = { | 48 static const uint8_t run_value_bits_short[16] = { |
| 49 3, 3, 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 9 | 49 3, 3, 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 9 |
| 50 }; | 50 }; |
| 51 | 51 |
| 52 static const uint8_t* run_value_bits[2] = { | 52 static const uint8_t *run_value_bits[2] = { |
| 53 run_value_bits_long, run_value_bits_short | 53 run_value_bits_long, run_value_bits_short |
| 54 }; | 54 }; |
| 55 | 55 |
| 56 | 56 |
| 57 /** | 57 /** |
| 62 static av_always_inline int quant(float coef, const float Q) | 62 static av_always_inline int quant(float coef, const float Q) |
| 63 { | 63 { |
| 64 return pow(coef * Q, 0.75) + 0.4054; | 64 return pow(coef * Q, 0.75) + 0.4054; |
| 65 } | 65 } |
| 66 | 66 |
| 67 static void quantize_bands(int (*out)[2], const float *in, const float *scaled, int size, float Q34, int is_signed, int maxval) | 67 static void quantize_bands(int (*out)[2], const float *in, const float *scaled, |
| 68 int size, float Q34, int is_signed, int maxval) | |
| 68 { | 69 { |
| 69 int i; | 70 int i; |
| 70 double qc; | 71 double qc; |
| 71 for (i = 0; i < size; i++) { | 72 for (i = 0; i < size; i++) { |
| 72 qc = scaled[i] * Q34; | 73 qc = scaled[i] * Q34; |
| 73 out[i][0] = (int)FFMIN((int)qc, maxval); | 74 out[i][0] = (int)FFMIN((int)qc, maxval); |
| 74 out[i][1] = (int)FFMIN((int)(qc + 0.4054), maxval); | 75 out[i][1] = (int)FFMIN((int)(qc + 0.4054), maxval); |
| 75 if (is_signed && in[i] < 0.0f) { | 76 if (is_signed && in[i] < 0.0f) { |
| 76 out[i][0] = -out[i][0]; | 77 out[i][0] = -out[i][0]; |
| 77 out[i][1] = -out[i][1]; | 78 out[i][1] = -out[i][1]; |
| 78 } | 79 } |
| 79 } | 80 } |
| 80 } | 81 } |
| 81 | 82 |
| 82 static void abs_pow34_v(float *out, const float* in, const int size) | 83 static void abs_pow34_v(float *out, const float *in, const int size) |
| 83 { | 84 { |
| 84 #ifndef USE_REALLY_FULL_SEARCH | 85 #ifndef USE_REALLY_FULL_SEARCH |
| 85 int i; | 86 int i; |
| 86 for (i = 0; i < size; i++) { | 87 for (i = 0; i < size; i++) { |
| 87 out[i] = pow(fabsf(in[i]), 0.75); | 88 out[i] = pow(fabsf(in[i]), 0.75); |
| 100 /** | 101 /** |
| 101 * Calculate rate distortion cost for quantizing with given codebook | 102 * Calculate rate distortion cost for quantizing with given codebook |
| 102 * | 103 * |
| 103 * @return quantization distortion | 104 * @return quantization distortion |
| 104 */ | 105 */ |
| 105 static float quantize_band_cost(struct AACEncContext *s, const float *in, const float *scaled, int size, int scale_idx, int cb, | 106 static float quantize_band_cost(struct AACEncContext *s, const float *in, |
| 106 const float lambda, const float uplim, int *bits) | 107 const float *scaled, int size, int scale_idx, |
| 108 int cb, const float lambda, const float uplim, | |
| 109 int *bits) | |
| 107 { | 110 { |
| 108 const float IQ = ff_aac_pow2sf_tab[200 + scale_idx - SCALE_ONE_POS + SCALE_DIV_512]; | 111 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]; | 112 const float Q = ff_aac_pow2sf_tab[200 - scale_idx + SCALE_ONE_POS - SCALE_DIV_512]; |
| 110 const float CLIPPED_ESCAPE = 165140.0f*IQ; | 113 const float CLIPPED_ESCAPE = 165140.0f*IQ; |
| 111 int i, j, k; | 114 int i, j, k; |
| 112 float cost = 0; | 115 float cost = 0; |
| 113 const int dim = cb < FIRST_PAIR_BT ? 4 : 2; | 116 const int dim = cb < FIRST_PAIR_BT ? 4 : 2; |
| 114 int resbits = 0; | 117 int resbits = 0; |
| 115 #ifndef USE_REALLY_FULL_SEARCH | 118 #ifndef USE_REALLY_FULL_SEARCH |
| 116 const float Q34 = pow(Q, 0.75); | 119 const float Q34 = pow(Q, 0.75); |
| 117 const int range = aac_cb_range[cb]; | 120 const int range = aac_cb_range[cb]; |
| 118 const int maxval = aac_cb_maxval[cb]; | 121 const int maxval = aac_cb_maxval[cb]; |
| 119 int offs[4]; | 122 int offs[4]; |
| 120 #endif /* USE_REALLY_FULL_SEARCH */ | 123 #endif /* USE_REALLY_FULL_SEARCH */ |
| 121 | 124 |
| 122 if (!cb) { | 125 if (!cb) { |
| 130 offs[i] = offs[i-1]*range; | 133 offs[i] = offs[i-1]*range; |
| 131 quantize_bands(s->qcoefs, in, scaled, size, Q34, !IS_CODEBOOK_UNSIGNED(cb), maxval); | 134 quantize_bands(s->qcoefs, in, scaled, size, Q34, !IS_CODEBOOK_UNSIGNED(cb), maxval); |
| 132 #endif /* USE_REALLY_FULL_SEARCH */ | 135 #endif /* USE_REALLY_FULL_SEARCH */ |
| 133 for (i = 0; i < size; i += dim) { | 136 for (i = 0; i < size; i += dim) { |
| 134 float mincost; | 137 float mincost; |
| 135 int minidx = 0; | 138 int minidx = 0; |
| 136 int minbits = 0; | 139 int minbits = 0; |
| 137 const float *vec; | 140 const float *vec; |
| 138 #ifndef USE_REALLY_FULL_SEARCH | 141 #ifndef USE_REALLY_FULL_SEARCH |
| 139 int (*quants)[2] = &s->qcoefs[i]; | 142 int (*quants)[2] = &s->qcoefs[i]; |
| 140 mincost = 0.0f; | 143 mincost = 0.0f; |
| 146 mincost += minbits; | 149 mincost += minbits; |
| 147 for (j = 0; j < (1<<dim); j++) { | 150 for (j = 0; j < (1<<dim); j++) { |
| 148 float rd = 0.0f; | 151 float rd = 0.0f; |
| 149 int curbits; | 152 int curbits; |
| 150 int curidx = IS_CODEBOOK_UNSIGNED(cb) ? 0 : 40; | 153 int curidx = IS_CODEBOOK_UNSIGNED(cb) ? 0 : 40; |
| 151 int same = 0; | 154 int same = 0; |
| 152 for (k = 0; k < dim; k++) { | 155 for (k = 0; k < dim; k++) { |
| 153 if ((j & (1 << k)) && quants[k][0] == quants[k][1]) { | 156 if ((j & (1 << k)) && quants[k][0] == quants[k][1]) { |
| 154 same = 1; | 157 same = 1; |
| 155 break; | 158 break; |
| 156 } | 159 } |
| 157 } | 160 } |
| 158 if (same) | 161 if (same) |
| 159 continue; | 162 continue; |
| 160 for (k = 0; k < dim; k++) | 163 for (k = 0; k < dim; k++) |
| 161 curidx += quants[k][!!(j & (1 << k))] * offs[dim - 1 - k]; | 164 curidx += quants[k][!!(j & (1 << k))] * offs[dim - 1 - k]; |
| 162 curbits = ff_aac_spectral_bits[cb-1][curidx]; | 165 curbits = ff_aac_spectral_bits[cb-1][curidx]; |
| 163 vec = &ff_aac_codebook_vectors[cb-1][curidx*dim]; | 166 vec = &ff_aac_codebook_vectors[cb-1][curidx*dim]; |
| 164 #else | 167 #else |
| 165 mincost = INFINITY; | 168 mincost = INFINITY; |
| 166 vec = ff_aac_codebook_vectors[cb-1]; | 169 vec = ff_aac_codebook_vectors[cb-1]; |
| 167 for (j = 0; j < ff_aac_spectral_sizes[cb-1]; j++, vec += dim) { | 170 for (j = 0; j < ff_aac_spectral_sizes[cb-1]; j++, vec += dim) { |
| 168 float rd = 0.0f; | 171 float rd = 0.0f; |
| 175 //do not code with escape sequence small values | 178 //do not code with escape sequence small values |
| 176 if (vec[k] == 64.0f && t < 39.0f*IQ) { | 179 if (vec[k] == 64.0f && t < 39.0f*IQ) { |
| 177 rd = INFINITY; | 180 rd = INFINITY; |
| 178 break; | 181 break; |
| 179 } | 182 } |
| 180 if (vec[k] == 64.0f) {//FIXME: slow | 183 if (vec[k] == 64.0f) { //FIXME: slow |
| 181 if (t >= CLIPPED_ESCAPE) { | 184 if (t >= CLIPPED_ESCAPE) { |
| 182 di = t - CLIPPED_ESCAPE; | 185 di = t - CLIPPED_ESCAPE; |
| 183 curbits += 21; | 186 curbits += 21; |
| 184 } else { | 187 } else { |
| 185 int c = av_clip(quant(t, Q), 0, 8191); | 188 int c = av_clip(quant(t, Q), 0, 8191); |
| 200 } | 203 } |
| 201 } | 204 } |
| 202 rd += curbits; | 205 rd += curbits; |
| 203 if (rd < mincost) { | 206 if (rd < mincost) { |
| 204 mincost = rd; | 207 mincost = rd; |
| 205 minidx = j; | 208 minidx = j; |
| 206 minbits = curbits; | 209 minbits = curbits; |
| 207 } | 210 } |
| 208 } | 211 } |
| 209 cost += mincost; | 212 cost += mincost; |
| 210 resbits += minbits; | 213 resbits += minbits; |
| 211 if (cost >= uplim) | 214 if (cost >= uplim) |
| 212 return uplim; | 215 return uplim; |
| 213 } | 216 } |
| 214 | 217 |
| 215 if (bits) | 218 if (bits) |
| 216 *bits = resbits; | 219 *bits = resbits; |
| 217 return cost; | 220 return cost; |
| 218 } | 221 } |
| 219 | 222 |
| 220 static void quantize_and_encode_band(struct AACEncContext *s, PutBitContext *pb, const float *in, int size, | 223 static void quantize_and_encode_band(struct AACEncContext *s, PutBitContext *pb, |
| 221 int scale_idx, int cb, const float lambda) | 224 const float *in, int size, int scale_idx, |
| 225 int cb, const float lambda) | |
| 222 { | 226 { |
| 223 const float IQ = ff_aac_pow2sf_tab[200 + scale_idx - SCALE_ONE_POS + SCALE_DIV_512]; | 227 const float IQ = ff_aac_pow2sf_tab[200 + scale_idx - SCALE_ONE_POS + SCALE_DIV_512]; |
| 224 const float Q = ff_aac_pow2sf_tab[200 - scale_idx + SCALE_ONE_POS - SCALE_DIV_512]; | 228 const float Q = ff_aac_pow2sf_tab[200 - scale_idx + SCALE_ONE_POS - SCALE_DIV_512]; |
| 225 const float CLIPPED_ESCAPE = 165140.0f*IQ; | 229 const float CLIPPED_ESCAPE = 165140.0f*IQ; |
| 226 const int dim = (cb < FIRST_PAIR_BT) ? 4 : 2; | 230 const int dim = (cb < FIRST_PAIR_BT) ? 4 : 2; |
| 227 int i, j, k; | 231 int i, j, k; |
| 228 #ifndef USE_REALLY_FULL_SEARCH | 232 #ifndef USE_REALLY_FULL_SEARCH |
| 229 const float Q34 = pow(Q, 0.75); | 233 const float Q34 = pow(Q, 0.75); |
| 230 const int range = aac_cb_range[cb]; | 234 const int range = aac_cb_range[cb]; |
| 231 const int maxval = aac_cb_maxval[cb]; | 235 const int maxval = aac_cb_maxval[cb]; |
| 232 int offs[4]; | 236 int offs[4]; |
| 233 float *scaled = s->scoefs; | 237 float *scaled = s->scoefs; |
| 234 #endif /* USE_REALLY_FULL_SEARCH */ | 238 #endif /* USE_REALLY_FULL_SEARCH */ |
| 235 | 239 |
| 244 abs_pow34_v(scaled, in, size); | 248 abs_pow34_v(scaled, in, size); |
| 245 quantize_bands(s->qcoefs, in, scaled, size, Q34, !IS_CODEBOOK_UNSIGNED(cb), maxval); | 249 quantize_bands(s->qcoefs, in, scaled, size, Q34, !IS_CODEBOOK_UNSIGNED(cb), maxval); |
| 246 #endif /* USE_REALLY_FULL_SEARCH */ | 250 #endif /* USE_REALLY_FULL_SEARCH */ |
| 247 for (i = 0; i < size; i += dim) { | 251 for (i = 0; i < size; i += dim) { |
| 248 float mincost; | 252 float mincost; |
| 249 int minidx = 0; | 253 int minidx = 0; |
| 250 int minbits = 0; | 254 int minbits = 0; |
| 251 const float *vec; | 255 const float *vec; |
| 252 #ifndef USE_REALLY_FULL_SEARCH | 256 #ifndef USE_REALLY_FULL_SEARCH |
| 253 int (*quants)[2] = &s->qcoefs[i]; | 257 int (*quants)[2] = &s->qcoefs[i]; |
| 254 mincost = 0.0f; | 258 mincost = 0.0f; |
| 260 mincost += minbits; | 264 mincost += minbits; |
| 261 for (j = 0; j < (1<<dim); j++) { | 265 for (j = 0; j < (1<<dim); j++) { |
| 262 float rd = 0.0f; | 266 float rd = 0.0f; |
| 263 int curbits; | 267 int curbits; |
| 264 int curidx = IS_CODEBOOK_UNSIGNED(cb) ? 0 : 40; | 268 int curidx = IS_CODEBOOK_UNSIGNED(cb) ? 0 : 40; |
| 265 int same = 0; | 269 int same = 0; |
| 266 for (k = 0; k < dim; k++) { | 270 for (k = 0; k < dim; k++) { |
| 267 if ((j & (1 << k)) && quants[k][0] == quants[k][1]) { | 271 if ((j & (1 << k)) && quants[k][0] == quants[k][1]) { |
| 268 same = 1; | 272 same = 1; |
| 269 break; | 273 break; |
| 270 } | 274 } |
| 271 } | 275 } |
| 272 if (same) | 276 if (same) |
| 273 continue; | 277 continue; |
| 274 for (k = 0; k < dim; k++) | 278 for (k = 0; k < dim; k++) |
| 275 curidx += quants[k][!!(j & (1 << k))] * offs[dim - 1 - k]; | 279 curidx += quants[k][!!(j & (1 << k))] * offs[dim - 1 - k]; |
| 276 curbits = ff_aac_spectral_bits[cb-1][curidx]; | 280 curbits = ff_aac_spectral_bits[cb-1][curidx]; |
| 277 vec = &ff_aac_codebook_vectors[cb-1][curidx*dim]; | 281 vec = &ff_aac_codebook_vectors[cb-1][curidx*dim]; |
| 278 #else | 282 #else |
| 279 vec = ff_aac_codebook_vectors[cb-1]; | 283 vec = ff_aac_codebook_vectors[cb-1]; |
| 280 mincost = INFINITY; | 284 mincost = INFINITY; |
| 281 for (j = 0; j < ff_aac_spectral_sizes[cb-1]; j++, vec += dim) { | 285 for (j = 0; j < ff_aac_spectral_sizes[cb-1]; j++, vec += dim) { |
| 282 float rd = 0.0f; | 286 float rd = 0.0f; |
| 283 int curbits = ff_aac_spectral_bits[cb-1][j]; | 287 int curbits = ff_aac_spectral_bits[cb-1][j]; |
| 284 int curidx = j; | 288 int curidx = j; |
| 285 #endif /* USE_REALLY_FULL_SEARCH */ | 289 #endif /* USE_REALLY_FULL_SEARCH */ |
| 286 if (IS_CODEBOOK_UNSIGNED(cb)) { | 290 if (IS_CODEBOOK_UNSIGNED(cb)) { |
| 287 for (k = 0; k < dim; k++) { | 291 for (k = 0; k < dim; k++) { |
| 288 float t = fabsf(in[i+k]); | 292 float t = fabsf(in[i+k]); |
| 289 float di; | 293 float di; |
| 290 //do not code with escape sequence small values | 294 //do not code with escape sequence small values |
| 291 if (vec[k] == 64.0f && t < 39.0f*IQ) { | 295 if (vec[k] == 64.0f && t < 39.0f*IQ) { |
| 292 rd = INFINITY; | 296 rd = INFINITY; |
| 293 break; | 297 break; |
| 294 } | 298 } |
| 295 if (vec[k] == 64.0f) {//FIXME: slow | 299 if (vec[k] == 64.0f) { //FIXME: slow |
| 296 if (t >= CLIPPED_ESCAPE) { | 300 if (t >= CLIPPED_ESCAPE) { |
| 297 di = t - CLIPPED_ESCAPE; | 301 di = t - CLIPPED_ESCAPE; |
| 298 curbits += 21; | 302 curbits += 21; |
| 299 } else { | 303 } else { |
| 300 int c = av_clip(quant(t, Q), 0, 8191); | 304 int c = av_clip(quant(t, Q), 0, 8191); |
| 315 } | 319 } |
| 316 } | 320 } |
| 317 rd += curbits; | 321 rd += curbits; |
| 318 if (rd < mincost) { | 322 if (rd < mincost) { |
| 319 mincost = rd; | 323 mincost = rd; |
| 320 minidx = curidx; | 324 minidx = curidx; |
| 321 minbits = curbits; | 325 minbits = curbits; |
| 322 } | 326 } |
| 323 } | 327 } |
| 324 put_bits(pb, ff_aac_spectral_bits[cb-1][minidx], ff_aac_spectral_codes[cb-1][minidx]); | 328 put_bits(pb, ff_aac_spectral_bits[cb-1][minidx], ff_aac_spectral_codes[cb-1][minidx]); |
| 325 if (IS_CODEBOOK_UNSIGNED(cb)) | 329 if (IS_CODEBOOK_UNSIGNED(cb)) |
| 358 int win, int group_len, const float lambda) | 362 int win, int group_len, const float lambda) |
| 359 { | 363 { |
| 360 BandCodingPath path[120][12]; | 364 BandCodingPath path[120][12]; |
| 361 int w, swb, cb, start, start2, size; | 365 int w, swb, cb, start, start2, size; |
| 362 int i, j; | 366 int i, j; |
| 363 const int max_sfb = sce->ics.max_sfb; | 367 const int max_sfb = sce->ics.max_sfb; |
| 364 const int run_bits = sce->ics.num_windows == 1 ? 5 : 3; | 368 const int run_bits = sce->ics.num_windows == 1 ? 5 : 3; |
| 365 const int run_esc = (1 << run_bits) - 1; | 369 const int run_esc = (1 << run_bits) - 1; |
| 366 int idx, ppos, count; | 370 int idx, ppos, count; |
| 367 int stackrun[120], stackcb[120], stack_len; | 371 int stackrun[120], stackcb[120], stack_len; |
| 368 float next_minrd = INFINITY; | 372 float next_minrd = INFINITY; |
| 369 int next_mincb = 0; | 373 int next_mincb = 0; |
| 370 | 374 |
| 371 abs_pow34_v(s->scoefs, sce->coeffs, 1024); | 375 abs_pow34_v(s->scoefs, sce->coeffs, 1024); |
| 372 start = win*128; | 376 start = win*128; |
| 373 for (cb = 0; cb < 12; cb++) { | 377 for (cb = 0; cb < 12; cb++) { |
| 374 path[0][cb].cost = 0.0f; | 378 path[0][cb].cost = 0.0f; |
| 375 path[0][cb].prev_idx = -1; | 379 path[0][cb].prev_idx = -1; |
| 376 path[0][cb].run = 0; | 380 path[0][cb].run = 0; |
| 377 } | 381 } |
| 378 for (swb = 0; swb < max_sfb; swb++) { | 382 for (swb = 0; swb < max_sfb; swb++) { |
| 379 start2 = start; | 383 start2 = start; |
| 380 size = sce->ics.swb_sizes[swb]; | 384 size = sce->ics.swb_sizes[swb]; |
| 381 if (sce->zeroes[win*16 + swb]) { | 385 if (sce->zeroes[win*16 + swb]) { |
| 382 for (cb = 0; cb < 12; cb++) { | 386 for (cb = 0; cb < 12; cb++) { |
| 383 path[swb+1][cb].prev_idx = cb; | 387 path[swb+1][cb].prev_idx = cb; |
| 384 path[swb+1][cb].cost = path[swb][cb].cost; | 388 path[swb+1][cb].cost = path[swb][cb].cost; |
| 385 path[swb+1][cb].run = path[swb][cb].run + 1; | 389 path[swb+1][cb].run = path[swb][cb].run + 1; |
| 386 } | 390 } |
| 387 } else { | 391 } else { |
| 388 float minrd = next_minrd; | 392 float minrd = next_minrd; |
| 389 int mincb = next_mincb; | 393 int mincb = next_mincb; |
| 390 next_minrd = INFINITY; | 394 next_minrd = INFINITY; |
| 400 lambda / band->threshold, INFINITY, NULL); | 404 lambda / band->threshold, INFINITY, NULL); |
| 401 } | 405 } |
| 402 cost_stay_here = path[swb][cb].cost + rd; | 406 cost_stay_here = path[swb][cb].cost + rd; |
| 403 cost_get_here = minrd + rd + run_bits + 4; | 407 cost_get_here = minrd + rd + run_bits + 4; |
| 404 if ( run_value_bits[sce->ics.num_windows == 8][path[swb][cb].run] | 408 if ( run_value_bits[sce->ics.num_windows == 8][path[swb][cb].run] |
| 405 != run_value_bits[sce->ics.num_windows == 8][path[swb][cb].run+1]) | 409 != run_value_bits[sce->ics.num_windows == 8][path[swb][cb].run+1]) |
| 406 cost_stay_here += run_bits; | 410 cost_stay_here += run_bits; |
| 407 if (cost_get_here < cost_stay_here) { | 411 if (cost_get_here < cost_stay_here) { |
| 408 path[swb+1][cb].prev_idx = mincb; | 412 path[swb+1][cb].prev_idx = mincb; |
| 409 path[swb+1][cb].cost = cost_get_here; | 413 path[swb+1][cb].cost = cost_get_here; |
| 410 path[swb+1][cb].run = 1; | 414 path[swb+1][cb].run = 1; |
| 422 start += sce->ics.swb_sizes[swb]; | 426 start += sce->ics.swb_sizes[swb]; |
| 423 } | 427 } |
| 424 | 428 |
| 425 //convert resulting path from backward-linked list | 429 //convert resulting path from backward-linked list |
| 426 stack_len = 0; | 430 stack_len = 0; |
| 427 idx = 0; | 431 idx = 0; |
| 428 for (cb = 1; cb < 12; cb++) { | 432 for (cb = 1; cb < 12; cb++) { |
| 429 if (path[max_sfb][cb].cost < path[max_sfb][idx].cost) | 433 if (path[max_sfb][cb].cost < path[max_sfb][idx].cost) |
| 430 idx = cb; | 434 idx = cb; |
| 431 } | 435 } |
| 432 ppos = max_sfb; | 436 ppos = max_sfb; |
| 433 while(ppos > 0) { | 437 while (ppos > 0) { |
| 434 cb = idx; | 438 cb = idx; |
| 435 stackrun[stack_len] = path[ppos][cb].run; | 439 stackrun[stack_len] = path[ppos][cb].run; |
| 436 stackcb [stack_len] = cb; | 440 stackcb [stack_len] = cb; |
| 437 idx = path[ppos-path[ppos][cb].run+1][cb].prev_idx; | 441 idx = path[ppos-path[ppos][cb].run+1][cb].prev_idx; |
| 438 ppos -= path[ppos][cb].run; | 442 ppos -= path[ppos][cb].run; |
| 447 //XXX: memset when band_type is also uint8_t | 451 //XXX: memset when band_type is also uint8_t |
| 448 for (j = 0; j < count; j++) { | 452 for (j = 0; j < count; j++) { |
| 449 sce->band_type[win*16 + start] = stackcb[i]; | 453 sce->band_type[win*16 + start] = stackcb[i]; |
| 450 start++; | 454 start++; |
| 451 } | 455 } |
| 452 while(count >= run_esc) { | 456 while (count >= run_esc) { |
| 453 put_bits(&s->pb, run_bits, run_esc); | 457 put_bits(&s->pb, run_bits, run_esc); |
| 454 count -= run_esc; | 458 count -= run_esc; |
| 455 } | 459 } |
| 456 put_bits(&s->pb, run_bits, count); | 460 put_bits(&s->pb, run_bits, count); |
| 457 } | 461 } |
| 458 } | 462 } |
| 459 | 463 |
| 460 static void encode_window_bands_info_fixed(AACEncContext *s, SingleChannelElement *sce, | 464 static void encode_window_bands_info_fixed(AACEncContext *s, |
| 461 int win, int group_len, const float lambda) | 465 SingleChannelElement *sce, |
| 466 int win, int group_len, | |
| 467 const float lambda) | |
| 462 { | 468 { |
| 463 encode_window_bands_info(s, sce, win, group_len, 1.0f); | 469 encode_window_bands_info(s, sce, win, group_len, 1.0f); |
| 464 } | 470 } |
| 465 | 471 |
| 466 | 472 |
| 470 int min_val; | 476 int min_val; |
| 471 int max_val; | 477 int max_val; |
| 472 } TrellisPath; | 478 } TrellisPath; |
| 473 | 479 |
| 474 static void search_for_quantizers_anmr(AVCodecContext *avctx, AACEncContext *s, | 480 static void search_for_quantizers_anmr(AVCodecContext *avctx, AACEncContext *s, |
| 475 SingleChannelElement *sce, const float lambda) | 481 SingleChannelElement *sce, |
| 482 const float lambda) | |
| 476 { | 483 { |
| 477 int q, w, w2, g, start = 0; | 484 int q, w, w2, g, start = 0; |
| 478 int i; | 485 int i; |
| 479 int idx; | 486 int idx; |
| 480 TrellisPath paths[256*121]; | 487 TrellisPath paths[256*121]; |
| 481 int bandaddr[121]; | 488 int bandaddr[121]; |
| 482 int minq; | 489 int minq; |
| 483 float mincost; | 490 float mincost; |
| 484 | 491 |
| 485 for (i = 0; i < 256; i++) { | 492 for (i = 0; i < 256; i++) { |
| 486 paths[i].cost = 0.0f; | 493 paths[i].cost = 0.0f; |
| 487 paths[i].prev = -1; | 494 paths[i].prev = -1; |
| 488 paths[i].min_val = i; | 495 paths[i].min_val = i; |
| 489 paths[i].max_val = i; | 496 paths[i].max_val = i; |
| 490 } | 497 } |
| 491 for (i = 256; i < 256*121; i++) { | 498 for (i = 256; i < 256*121; i++) { |
| 492 paths[i].cost = INFINITY; | 499 paths[i].cost = INFINITY; |
| 493 paths[i].prev = -2; | 500 paths[i].prev = -2; |
| 494 paths[i].min_val = INT_MAX; | 501 paths[i].min_val = INT_MAX; |
| 495 paths[i].max_val = 0; | 502 paths[i].max_val = 0; |
| 496 } | 503 } |
| 497 idx = 256; | 504 idx = 256; |
| 498 abs_pow34_v(s->scoefs, sce->coeffs, 1024); | 505 abs_pow34_v(s->scoefs, sce->coeffs, 1024); |
| 501 for (g = 0; g < sce->ics.num_swb; g++) { | 508 for (g = 0; g < sce->ics.num_swb; g++) { |
| 502 const float *coefs = sce->coeffs + start; | 509 const float *coefs = sce->coeffs + start; |
| 503 float qmin, qmax; | 510 float qmin, qmax; |
| 504 int nz = 0; | 511 int nz = 0; |
| 505 | 512 |
| 506 bandaddr[idx >> 8] = w*16+g; | 513 bandaddr[idx >> 8] = w * 16 + g; |
| 507 qmin = INT_MAX; | 514 qmin = INT_MAX; |
| 508 qmax = 0.0f; | 515 qmax = 0.0f; |
| 509 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { | 516 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { |
| 510 FFPsyBand *band = &s->psy.psy_bands[s->cur_channel*PSY_MAX_BANDS+(w+w2)*16+g]; | 517 FFPsyBand *band = &s->psy.psy_bands[s->cur_channel*PSY_MAX_BANDS+(w+w2)*16+g]; |
| 511 if (band->energy <= band->threshold || band->threshold == 0.0f) { | 518 if (band->energy <= band->threshold || band->threshold == 0.0f) { |
| 551 cost = paths[idx - 256 + i].cost + dist | 558 cost = paths[idx - 256 + i].cost + dist |
| 552 + ff_aac_scalefactor_bits[q - i + SCALE_DIFF_ZERO]; | 559 + ff_aac_scalefactor_bits[q - i + SCALE_DIFF_ZERO]; |
| 553 minv = FFMIN(paths[idx - 256 + i].min_val, q); | 560 minv = FFMIN(paths[idx - 256 + i].min_val, q); |
| 554 maxv = FFMAX(paths[idx - 256 + i].max_val, q); | 561 maxv = FFMAX(paths[idx - 256 + i].max_val, q); |
| 555 if (cost < paths[idx + q].cost && maxv-minv < SCALE_MAX_DIFF) { | 562 if (cost < paths[idx + q].cost && maxv-minv < SCALE_MAX_DIFF) { |
| 556 paths[idx + q].cost = cost; | 563 paths[idx + q].cost = cost; |
| 557 paths[idx + q].prev = idx - 256 + i; | 564 paths[idx + q].prev = idx - 256 + i; |
| 558 paths[idx + q].min_val = minv; | 565 paths[idx + q].min_val = minv; |
| 559 paths[idx + q].max_val = maxv; | 566 paths[idx + q].max_val = maxv; |
| 560 } | 567 } |
| 561 } | 568 } |
| 562 } | 569 } |
| 576 continue; | 583 continue; |
| 577 cost = paths[idx - 256 + i].cost + ff_aac_scalefactor_bits[q - i + SCALE_DIFF_ZERO]; | 584 cost = paths[idx - 256 + i].cost + ff_aac_scalefactor_bits[q - i + SCALE_DIFF_ZERO]; |
| 578 minv = FFMIN(paths[idx - 256 + i].min_val, q); | 585 minv = FFMIN(paths[idx - 256 + i].min_val, q); |
| 579 maxv = FFMAX(paths[idx - 256 + i].max_val, q); | 586 maxv = FFMAX(paths[idx - 256 + i].max_val, q); |
| 580 if (cost < paths[idx + q].cost && maxv-minv < SCALE_MAX_DIFF) { | 587 if (cost < paths[idx + q].cost && maxv-minv < SCALE_MAX_DIFF) { |
| 581 paths[idx + q].cost = cost; | 588 paths[idx + q].cost = cost; |
| 582 paths[idx + q].prev = idx - 256 + i; | 589 paths[idx + q].prev = idx - 256 + i; |
| 583 paths[idx + q].min_val = minv; | 590 paths[idx + q].min_val = minv; |
| 584 paths[idx + q].max_val = maxv; | 591 paths[idx + q].max_val = maxv; |
| 585 } | 592 } |
| 586 } | 593 } |
| 587 } | 594 } |
| 588 } | 595 } |
| 589 sce->zeroes[w*16+g] = !nz; | 596 sce->zeroes[w*16+g] = !nz; |
| 590 start += sce->ics.swb_sizes[g]; | 597 start += sce->ics.swb_sizes[g]; |
| 591 idx += 256; | 598 idx += 256; |
| 592 } | 599 } |
| 593 } | 600 } |
| 594 idx -= 256; | 601 idx -= 256; |
| 595 mincost = paths[idx].cost; | 602 mincost = paths[idx].cost; |
| 596 minq = idx; | 603 minq = idx; |
| 597 for (i = 1; i < 256; i++) { | 604 for (i = 1; i < 256; i++) { |
| 598 if (paths[idx + i].cost < mincost) { | 605 if (paths[idx + i].cost < mincost) { |
| 599 mincost = paths[idx + i].cost; | 606 mincost = paths[idx + i].cost; |
| 600 minq = idx + i; | 607 minq = idx + i; |
| 601 } | 608 } |
| 602 } | 609 } |
| 603 while(minq >= 256) { | 610 while (minq >= 256) { |
| 604 sce->sf_idx[bandaddr[minq>>8]] = minq & 0xFF; | 611 sce->sf_idx[bandaddr[minq>>8]] = minq & 0xFF; |
| 605 minq = paths[minq].prev; | 612 minq = paths[minq].prev; |
| 606 } | 613 } |
| 607 //set the same quantizers inside window groups | 614 //set the same quantizers inside window groups |
| 608 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) | 615 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) |
| 612 } | 619 } |
| 613 | 620 |
| 614 /** | 621 /** |
| 615 * two-loop quantizers search taken from ISO 13818-7 Appendix C | 622 * two-loop quantizers search taken from ISO 13818-7 Appendix C |
| 616 */ | 623 */ |
| 617 static void search_for_quantizers_twoloop(AVCodecContext *avctx, AACEncContext *s, | 624 static void search_for_quantizers_twoloop(AVCodecContext *avctx, |
| 618 SingleChannelElement *sce, const float lambda) | 625 AACEncContext *s, |
| 626 SingleChannelElement *sce, | |
| 627 const float lambda) | |
| 619 { | 628 { |
| 620 int start = 0, i, w, w2, g; | 629 int start = 0, i, w, w2, g; |
| 621 int destbits = avctx->bit_rate * 1024.0 / avctx->sample_rate / avctx->channels; | 630 int destbits = avctx->bit_rate * 1024.0 / avctx->sample_rate / avctx->channels; |
| 622 float dists[128], uplims[128]; | 631 float dists[128], uplims[128]; |
| 623 int fflag, minscaler; | 632 int fflag, minscaler; |
| 624 int its = 0; | 633 int its = 0; |
| 625 int allz = 0; | 634 int allz = 0; |
| 626 float minthr = INFINITY; | 635 float minthr = INFINITY; |
| 627 | 636 |
| 628 //XXX: some heuristic to determine initial quantizers will reduce search time | 637 //XXX: some heuristic to determine initial quantizers will reduce search time |
| 629 memset(dists, 0, sizeof(dists)); | 638 memset(dists, 0, sizeof(dists)); |
| 661 if (!allz) | 670 if (!allz) |
| 662 return; | 671 return; |
| 663 abs_pow34_v(s->scoefs, sce->coeffs, 1024); | 672 abs_pow34_v(s->scoefs, sce->coeffs, 1024); |
| 664 //perform two-loop search | 673 //perform two-loop search |
| 665 //outer loop - improve quality | 674 //outer loop - improve quality |
| 666 do{ | 675 do { |
| 667 int tbits, qstep; | 676 int tbits, qstep; |
| 668 minscaler = sce->sf_idx[0]; | 677 minscaler = sce->sf_idx[0]; |
| 669 //inner loop - quantize spectrum to fit into given number of bits | 678 //inner loop - quantize spectrum to fit into given number of bits |
| 670 qstep = its ? 1 : 32; | 679 qstep = its ? 1 : 32; |
| 671 do{ | 680 do { |
| 672 int prev = -1; | 681 int prev = -1; |
| 673 tbits = 0; | 682 tbits = 0; |
| 674 fflag = 0; | 683 fflag = 0; |
| 675 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { | 684 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
| 676 start = w*128; | 685 start = w*128; |
| 730 } | 739 } |
| 731 qstep >>= 1; | 740 qstep >>= 1; |
| 732 if (!qstep && tbits > destbits*1.02) | 741 if (!qstep && tbits > destbits*1.02) |
| 733 qstep = 1; | 742 qstep = 1; |
| 734 if (sce->sf_idx[0] >= 217)break; | 743 if (sce->sf_idx[0] >= 217)break; |
| 735 }while(qstep); | 744 } while (qstep); |
| 736 | 745 |
| 737 fflag = 0; | 746 fflag = 0; |
| 738 minscaler = av_clip(minscaler, 60, 255 - SCALE_MAX_DIFF); | 747 minscaler = av_clip(minscaler, 60, 255 - SCALE_MAX_DIFF); |
| 739 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { | 748 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
| 740 start = w*128; | 749 start = w*128; |
| 747 if (sce->sf_idx[w*16+g] != prevsc) | 756 if (sce->sf_idx[w*16+g] != prevsc) |
| 748 fflag = 1; | 757 fflag = 1; |
| 749 } | 758 } |
| 750 } | 759 } |
| 751 its++; | 760 its++; |
| 752 }while(fflag && its < 10); | 761 } while (fflag && its < 10); |
| 753 } | 762 } |
| 754 | 763 |
| 755 static void search_for_quantizers_faac(AVCodecContext *avctx, AACEncContext *s, | 764 static void search_for_quantizers_faac(AVCodecContext *avctx, AACEncContext *s, |
| 756 SingleChannelElement *sce, const float lambda) | 765 SingleChannelElement *sce, |
| 766 const float lambda) | |
| 757 { | 767 { |
| 758 int start = 0, i, w, w2, g; | 768 int start = 0, i, w, w2, g; |
| 759 float uplim[128], maxq[128]; | 769 float uplim[128], maxq[128]; |
| 760 int minq, maxsf; | 770 int minq, maxsf; |
| 761 float distfact = ((sce->ics.num_windows > 1) ? 85.80 : 147.84) / lambda; | 771 float distfact = ((sce->ics.num_windows > 1) ? 85.80 : 147.84) / lambda; |
| 799 return; | 809 return; |
| 800 } | 810 } |
| 801 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { | 811 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
| 802 start = w*128; | 812 start = w*128; |
| 803 for (g = 0; g < sce->ics.num_swb; g++) { | 813 for (g = 0; g < sce->ics.num_swb; g++) { |
| 804 float *coefs = sce->coeffs + start; | 814 float *coefs = sce->coeffs + start; |
| 805 const int size = sce->ics.swb_sizes[g]; | 815 const int size = sce->ics.swb_sizes[g]; |
| 806 int start2 = start, end2 = start + size, peakpos = start; | 816 int start2 = start, end2 = start + size, peakpos = start; |
| 807 float maxval = -1, thr = 0.0f, t; | 817 float maxval = -1, thr = 0.0f, t; |
| 808 maxq[w*16+g] = 0.0f; | 818 maxq[w*16+g] = 0.0f; |
| 809 if (g > lastband) { | 819 if (g > lastband) { |
| 817 for (i = 0; i < size; i++) { | 827 for (i = 0; i < size; i++) { |
| 818 float t = coefs[w2*128+i]*coefs[w2*128+i]; | 828 float t = coefs[w2*128+i]*coefs[w2*128+i]; |
| 819 maxq[w*16+g] = fmaxf(maxq[w*16+g], fabsf(coefs[w2*128 + i])); | 829 maxq[w*16+g] = fmaxf(maxq[w*16+g], fabsf(coefs[w2*128 + i])); |
| 820 thr += t; | 830 thr += t; |
| 821 if (sce->ics.num_windows == 1 && maxval < t) { | 831 if (sce->ics.num_windows == 1 && maxval < t) { |
| 822 maxval = t; | 832 maxval = t; |
| 823 peakpos = start+i; | 833 peakpos = start+i; |
| 824 } | 834 } |
| 825 } | 835 } |
| 826 } | 836 } |
| 827 if (sce->ics.num_windows == 1) { | 837 if (sce->ics.num_windows == 1) { |
| 831 start2 -= start; | 841 start2 -= start; |
| 832 end2 -= start; | 842 end2 -= start; |
| 833 } | 843 } |
| 834 start += size; | 844 start += size; |
| 835 thr = pow(thr / (avg_energy * (end2 - start2)), 0.3 + 0.1*(lastband - g) / lastband); | 845 thr = pow(thr / (avg_energy * (end2 - start2)), 0.3 + 0.1*(lastband - g) / lastband); |
| 836 t = 1.0 - (1.0 * start2 / last); | 846 t = 1.0 - (1.0 * start2 / last); |
| 837 uplim[w*16+g] = distfact / (1.4 * thr + t*t*t + 0.075); | 847 uplim[w*16+g] = distfact / (1.4 * thr + t*t*t + 0.075); |
| 838 } | 848 } |
| 839 } | 849 } |
| 840 memset(sce->sf_idx, 0, sizeof(sce->sf_idx)); | 850 memset(sce->sf_idx, 0, sizeof(sce->sf_idx)); |
| 841 abs_pow34_v(s->scoefs, sce->coeffs, 1024); | 851 abs_pow34_v(s->scoefs, sce->coeffs, 1024); |
| 842 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { | 852 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
| 843 start = w*128; | 853 start = w*128; |
| 844 for (g = 0; g < sce->ics.num_swb; g++) { | 854 for (g = 0; g < sce->ics.num_swb; g++) { |
| 845 const float *coefs = sce->coeffs + start; | 855 const float *coefs = sce->coeffs + start; |
| 846 const float *scaled = s->scoefs + start; | 856 const float *scaled = s->scoefs + start; |
| 847 const int size = sce->ics.swb_sizes[g]; | 857 const int size = sce->ics.swb_sizes[g]; |
| 848 int scf, prev_scf, step; | 858 int scf, prev_scf, step; |
| 849 int min_scf = 0, max_scf = 255; | 859 int min_scf = 0, max_scf = 255; |
| 850 float curdiff; | 860 float curdiff; |
| 851 if (maxq[w*16+g] < 21.544) { | 861 if (maxq[w*16+g] < 21.544) { |
| 852 sce->zeroes[w*16+g] = 1; | 862 sce->zeroes[w*16+g] = 1; |
| 853 start += size; | 863 start += size; |
| 854 continue; | 864 continue; |
| 855 } | 865 } |
| 856 sce->zeroes[w*16+g] = 0; | 866 sce->zeroes[w*16+g] = 0; |
| 857 scf = prev_scf = av_clip(SCALE_ONE_POS - SCALE_DIV_512 - log2(1/maxq[w*16+g])*16/3, 60, 218); | 867 scf = prev_scf = av_clip(SCALE_ONE_POS - SCALE_DIV_512 - log2(1/maxq[w*16+g])*16/3, 60, 218); |
| 858 step = 16; | 868 step = 16; |
| 859 for (;;) { | 869 for (;;) { |
| 860 float dist = 0.0f; | 870 float dist = 0.0f; |
| 861 int quant_max; | 871 int quant_max; |
| 862 | 872 |
| 915 sce->sf_idx[i] = av_clip(sce->sf_idx[i], minq, maxsf); | 925 sce->sf_idx[i] = av_clip(sce->sf_idx[i], minq, maxsf); |
| 916 } | 926 } |
| 917 } | 927 } |
| 918 | 928 |
| 919 static void search_for_quantizers_fast(AVCodecContext *avctx, AACEncContext *s, | 929 static void search_for_quantizers_fast(AVCodecContext *avctx, AACEncContext *s, |
| 920 SingleChannelElement *sce, const float lambda) | 930 SingleChannelElement *sce, |
| 931 const float lambda) | |
| 921 { | 932 { |
| 922 int start = 0, i, w, w2, g; | 933 int start = 0, i, w, w2, g; |
| 923 int minq = 255; | 934 int minq = 255; |
| 924 | 935 |
| 925 memset(sce->sf_idx, 0, sizeof(sce->sf_idx)); | 936 memset(sce->sf_idx, 0, sizeof(sce->sf_idx)); |
| 947 for (g = 0; g < sce->ics.num_swb; g++) | 958 for (g = 0; g < sce->ics.num_swb; g++) |
| 948 for (w2 = 1; w2 < sce->ics.group_len[w]; w2++) | 959 for (w2 = 1; w2 < sce->ics.group_len[w]; w2++) |
| 949 sce->sf_idx[(w+w2)*16+g] = sce->sf_idx[w*16+g]; | 960 sce->sf_idx[(w+w2)*16+g] = sce->sf_idx[w*16+g]; |
| 950 } | 961 } |
| 951 | 962 |
| 952 static void search_for_ms(AACEncContext *s, ChannelElement *cpe, const float lambda) | 963 static void search_for_ms(AACEncContext *s, ChannelElement *cpe, |
| 964 const float lambda) | |
| 953 { | 965 { |
| 954 int start = 0, i, w, w2, g; | 966 int start = 0, i, w, w2, g; |
| 955 float M[128], S[128]; | 967 float M[128], S[128]; |
| 956 float *L34 = s->scoefs, *R34 = s->scoefs + 128, *M34 = s->scoefs + 128*2, *S34 = s->scoefs + 128*3; | 968 float *L34 = s->scoefs, *R34 = s->scoefs + 128, *M34 = s->scoefs + 128*2, *S34 = s->scoefs + 128*3; |
| 957 SingleChannelElement *sce0 = &cpe->ch[0]; | 969 SingleChannelElement *sce0 = &cpe->ch[0]; |
| 967 FFPsyBand *band1 = &s->psy.psy_bands[(s->cur_channel+1)*PSY_MAX_BANDS+(w+w2)*16+g]; | 979 FFPsyBand *band1 = &s->psy.psy_bands[(s->cur_channel+1)*PSY_MAX_BANDS+(w+w2)*16+g]; |
| 968 float minthr = fminf(band0->threshold, band1->threshold); | 980 float minthr = fminf(band0->threshold, band1->threshold); |
| 969 float maxthr = fmaxf(band0->threshold, band1->threshold); | 981 float maxthr = fmaxf(band0->threshold, band1->threshold); |
| 970 for (i = 0; i < sce0->ics.swb_sizes[g]; i++) { | 982 for (i = 0; i < sce0->ics.swb_sizes[g]; i++) { |
| 971 M[i] = (sce0->coeffs[start+w2*128+i] | 983 M[i] = (sce0->coeffs[start+w2*128+i] |
| 972 + sce1->coeffs[start+w2*128+i])*0.5; | 984 + sce1->coeffs[start+w2*128+i]) * 0.5; |
| 973 S[i] = sce0->coeffs[start+w2*128+i] | 985 S[i] = sce0->coeffs[start+w2*128+i] |
| 974 - sce1->coeffs[start+w2*128+i]; | 986 - sce1->coeffs[start+w2*128+i]; |
| 975 } | 987 } |
| 976 abs_pow34_v(L34, sce0->coeffs+start+w2*128, sce0->ics.swb_sizes[g]); | 988 abs_pow34_v(L34, sce0->coeffs+start+w2*128, sce0->ics.swb_sizes[g]); |
| 977 abs_pow34_v(R34, sce1->coeffs+start+w2*128, sce0->ics.swb_sizes[g]); | 989 abs_pow34_v(R34, sce1->coeffs+start+w2*128, sce0->ics.swb_sizes[g]); |
