Mercurial > libavcodec.hg
comparison aaccoder.c @ 9936:7f42ae22c351 libavcodec
Cosmetics: Pretty print the AAC encoder.
| author | alexc |
|---|---|
| date | Wed, 08 Jul 2009 20:36:45 +0000 |
| parents | d09283aeeef8 |
| children | 3e39dbd2d9eb |
comparison
equal
deleted
inserted
replaced
| 9935:d09283aeeef8 | 9936:7f42ae22c351 |
|---|---|
| 117 const int range = aac_cb_range[cb]; | 117 const int range = aac_cb_range[cb]; |
| 118 const int maxval = aac_cb_maxval[cb]; | 118 const int maxval = aac_cb_maxval[cb]; |
| 119 int offs[4]; | 119 int offs[4]; |
| 120 #endif /* USE_REALLY_FULL_SEARCH */ | 120 #endif /* USE_REALLY_FULL_SEARCH */ |
| 121 | 121 |
| 122 if(!cb){ | 122 if (!cb) { |
| 123 for(i = 0; i < size; i++) | 123 for (i = 0; i < size; i++) |
| 124 cost += in[i]*in[i]*lambda; | 124 cost += in[i]*in[i]*lambda; |
| 125 return cost; | 125 return cost; |
| 126 } | 126 } |
| 127 #ifndef USE_REALLY_FULL_SEARCH | 127 #ifndef USE_REALLY_FULL_SEARCH |
| 128 offs[0] = 1; | 128 offs[0] = 1; |
| 129 for(i = 1; i < dim; i++) | 129 for (i = 1; i < dim; i++) |
| 130 offs[i] = offs[i-1]*range; | 130 offs[i] = offs[i-1]*range; |
| 131 quantize_bands(s->qcoefs, in, scaled, size, Q34, !IS_CODEBOOK_UNSIGNED(cb), maxval); | 131 quantize_bands(s->qcoefs, in, scaled, size, Q34, !IS_CODEBOOK_UNSIGNED(cb), maxval); |
| 132 #endif /* USE_REALLY_FULL_SEARCH */ | 132 #endif /* USE_REALLY_FULL_SEARCH */ |
| 133 for(i = 0; i < size; i += dim){ | 133 for (i = 0; i < size; i += dim) { |
| 134 float mincost; | 134 float mincost; |
| 135 int minidx = 0; | 135 int minidx = 0; |
| 136 int minbits = 0; | 136 int minbits = 0; |
| 137 const float *vec; | 137 const float *vec; |
| 138 #ifndef USE_REALLY_FULL_SEARCH | 138 #ifndef USE_REALLY_FULL_SEARCH |
| 139 int (*quants)[2] = &s->qcoefs[i]; | 139 int (*quants)[2] = &s->qcoefs[i]; |
| 140 mincost = 0.0f; | 140 mincost = 0.0f; |
| 141 for(j = 0; j < dim; j++){ | 141 for (j = 0; j < dim; j++) { |
| 142 mincost += in[i+j]*in[i+j]*lambda; | 142 mincost += in[i+j]*in[i+j]*lambda; |
| 143 } | 143 } |
| 144 minidx = IS_CODEBOOK_UNSIGNED(cb) ? 0 : 40; | 144 minidx = IS_CODEBOOK_UNSIGNED(cb) ? 0 : 40; |
| 145 minbits = ff_aac_spectral_bits[cb-1][minidx]; | 145 minbits = ff_aac_spectral_bits[cb-1][minidx]; |
| 146 mincost += minbits; | 146 mincost += minbits; |
| 147 for(j = 0; j < (1<<dim); j++){ | 147 for (j = 0; j < (1<<dim); j++) { |
| 148 float rd = 0.0f; | 148 float rd = 0.0f; |
| 149 int curbits; | 149 int curbits; |
| 150 int curidx = IS_CODEBOOK_UNSIGNED(cb) ? 0 : 40; | 150 int curidx = IS_CODEBOOK_UNSIGNED(cb) ? 0 : 40; |
| 151 int same = 0; | 151 int same = 0; |
| 152 for(k = 0; k < dim; k++){ | 152 for (k = 0; k < dim; k++) { |
| 153 if((j & (1 << k)) && quants[k][0] == quants[k][1]){ | 153 if ((j & (1 << k)) && quants[k][0] == quants[k][1]) { |
| 154 same = 1; | 154 same = 1; |
| 155 break; | 155 break; |
| 156 } | 156 } |
| 157 } | 157 } |
| 158 if(same) | 158 if (same) |
| 159 continue; | 159 continue; |
| 160 for(k = 0; k < dim; k++) | 160 for (k = 0; k < dim; k++) |
| 161 curidx += quants[k][!!(j & (1 << k))] * offs[dim - 1 - k]; | 161 curidx += quants[k][!!(j & (1 << k))] * offs[dim - 1 - k]; |
| 162 curbits = ff_aac_spectral_bits[cb-1][curidx]; | 162 curbits = ff_aac_spectral_bits[cb-1][curidx]; |
| 163 vec = &ff_aac_codebook_vectors[cb-1][curidx*dim]; | 163 vec = &ff_aac_codebook_vectors[cb-1][curidx*dim]; |
| 164 #else | 164 #else |
| 165 mincost = INFINITY; | 165 mincost = INFINITY; |
| 166 vec = ff_aac_codebook_vectors[cb-1]; | 166 vec = ff_aac_codebook_vectors[cb-1]; |
| 167 for(j = 0; j < ff_aac_spectral_sizes[cb-1]; j++, vec += dim){ | 167 for (j = 0; j < ff_aac_spectral_sizes[cb-1]; j++, vec += dim) { |
| 168 float rd = 0.0f; | 168 float rd = 0.0f; |
| 169 int curbits = ff_aac_spectral_bits[cb-1][j]; | 169 int curbits = ff_aac_spectral_bits[cb-1][j]; |
| 170 #endif /* USE_REALLY_FULL_SEARCH */ | 170 #endif /* USE_REALLY_FULL_SEARCH */ |
| 171 if(IS_CODEBOOK_UNSIGNED(cb)){ | 171 if (IS_CODEBOOK_UNSIGNED(cb)) { |
| 172 for(k = 0; k < dim; k++){ | 172 for (k = 0; k < dim; k++) { |
| 173 float t = fabsf(in[i+k]); | 173 float t = fabsf(in[i+k]); |
| 174 float di; | 174 float di; |
| 175 //do not code with escape sequence small values | 175 //do not code with escape sequence small values |
| 176 if(vec[k] == 64.0f && t < 39.0f*IQ){ | 176 if (vec[k] == 64.0f && t < 39.0f*IQ) { |
| 177 rd = INFINITY; | 177 rd = INFINITY; |
| 178 break; | 178 break; |
| 179 } | 179 } |
| 180 if(vec[k] == 64.0f){//FIXME: slow | 180 if (vec[k] == 64.0f) {//FIXME: slow |
| 181 if (t >= CLIPPED_ESCAPE) { | 181 if (t >= CLIPPED_ESCAPE) { |
| 182 di = t - CLIPPED_ESCAPE; | 182 di = t - CLIPPED_ESCAPE; |
| 183 curbits += 21; | 183 curbits += 21; |
| 184 }else{ | 184 } else { |
| 185 int c = av_clip(quant(t, Q), 0, 8191); | 185 int c = av_clip(quant(t, Q), 0, 8191); |
| 186 di = t - c*cbrt(c)*IQ; | 186 di = t - c*cbrt(c)*IQ; |
| 187 curbits += av_log2(c)*2 - 4 + 1; | 187 curbits += av_log2(c)*2 - 4 + 1; |
| 188 } | 188 } |
| 189 }else{ | 189 } else { |
| 190 di = t - vec[k]*IQ; | 190 di = t - vec[k]*IQ; |
| 191 } | 191 } |
| 192 if(vec[k] != 0.0f) | 192 if (vec[k] != 0.0f) |
| 193 curbits++; | 193 curbits++; |
| 194 rd += di*di*lambda; | 194 rd += di*di*lambda; |
| 195 } | 195 } |
| 196 }else{ | 196 } else { |
| 197 for(k = 0; k < dim; k++){ | 197 for (k = 0; k < dim; k++) { |
| 198 float di = in[i+k] - vec[k]*IQ; | 198 float di = in[i+k] - vec[k]*IQ; |
| 199 rd += di*di*lambda; | 199 rd += di*di*lambda; |
| 200 } | 200 } |
| 201 } | 201 } |
| 202 rd += curbits; | 202 rd += curbits; |
| 203 if(rd < mincost){ | 203 if (rd < mincost) { |
| 204 mincost = rd; | 204 mincost = rd; |
| 205 minidx = j; | 205 minidx = j; |
| 206 minbits = curbits; | 206 minbits = curbits; |
| 207 } | 207 } |
| 208 } | 208 } |
| 209 cost += mincost; | 209 cost += mincost; |
| 210 resbits += minbits; | 210 resbits += minbits; |
| 211 if(cost >= uplim) | 211 if (cost >= uplim) |
| 212 return uplim; | 212 return uplim; |
| 213 } | 213 } |
| 214 | 214 |
| 215 if(bits) | 215 if (bits) |
| 216 *bits = resbits; | 216 *bits = resbits; |
| 217 return cost; | 217 return cost; |
| 218 } | 218 } |
| 219 | 219 |
| 220 static void quantize_and_encode_band(struct AACEncContext *s, PutBitContext *pb, const float *in, int size, | 220 static void quantize_and_encode_band(struct AACEncContext *s, PutBitContext *pb, const float *in, int size, |
| 232 int offs[4]; | 232 int offs[4]; |
| 233 float *scaled = s->scoefs; | 233 float *scaled = s->scoefs; |
| 234 #endif /* USE_REALLY_FULL_SEARCH */ | 234 #endif /* USE_REALLY_FULL_SEARCH */ |
| 235 | 235 |
| 236 //START_TIMER | 236 //START_TIMER |
| 237 if(!cb) | 237 if (!cb) |
| 238 return; | 238 return; |
| 239 | 239 |
| 240 #ifndef USE_REALLY_FULL_SEARCH | 240 #ifndef USE_REALLY_FULL_SEARCH |
| 241 offs[0] = 1; | 241 offs[0] = 1; |
| 242 for(i = 1; i < dim; i++) | 242 for (i = 1; i < dim; i++) |
| 243 offs[i] = offs[i-1]*range; | 243 offs[i] = offs[i-1]*range; |
| 244 abs_pow34_v(scaled, in, size); | 244 abs_pow34_v(scaled, in, size); |
| 245 quantize_bands(s->qcoefs, in, scaled, size, Q34, !IS_CODEBOOK_UNSIGNED(cb), maxval); | 245 quantize_bands(s->qcoefs, in, scaled, size, Q34, !IS_CODEBOOK_UNSIGNED(cb), maxval); |
| 246 #endif /* USE_REALLY_FULL_SEARCH */ | 246 #endif /* USE_REALLY_FULL_SEARCH */ |
| 247 for(i = 0; i < size; i += dim){ | 247 for (i = 0; i < size; i += dim) { |
| 248 float mincost; | 248 float mincost; |
| 249 int minidx = 0; | 249 int minidx = 0; |
| 250 int minbits = 0; | 250 int minbits = 0; |
| 251 const float *vec; | 251 const float *vec; |
| 252 #ifndef USE_REALLY_FULL_SEARCH | 252 #ifndef USE_REALLY_FULL_SEARCH |
| 253 int (*quants)[2] = &s->qcoefs[i]; | 253 int (*quants)[2] = &s->qcoefs[i]; |
| 254 mincost = 0.0f; | 254 mincost = 0.0f; |
| 255 for(j = 0; j < dim; j++){ | 255 for (j = 0; j < dim; j++) { |
| 256 mincost += in[i+j]*in[i+j]*lambda; | 256 mincost += in[i+j]*in[i+j]*lambda; |
| 257 } | 257 } |
| 258 minidx = IS_CODEBOOK_UNSIGNED(cb) ? 0 : 40; | 258 minidx = IS_CODEBOOK_UNSIGNED(cb) ? 0 : 40; |
| 259 minbits = ff_aac_spectral_bits[cb-1][minidx]; | 259 minbits = ff_aac_spectral_bits[cb-1][minidx]; |
| 260 mincost += minbits; | 260 mincost += minbits; |
| 261 for(j = 0; j < (1<<dim); j++){ | 261 for (j = 0; j < (1<<dim); j++) { |
| 262 float rd = 0.0f; | 262 float rd = 0.0f; |
| 263 int curbits; | 263 int curbits; |
| 264 int curidx = IS_CODEBOOK_UNSIGNED(cb) ? 0 : 40; | 264 int curidx = IS_CODEBOOK_UNSIGNED(cb) ? 0 : 40; |
| 265 int same = 0; | 265 int same = 0; |
| 266 for(k = 0; k < dim; k++){ | 266 for (k = 0; k < dim; k++) { |
| 267 if((j & (1 << k)) && quants[k][0] == quants[k][1]){ | 267 if ((j & (1 << k)) && quants[k][0] == quants[k][1]) { |
| 268 same = 1; | 268 same = 1; |
| 269 break; | 269 break; |
| 270 } | 270 } |
| 271 } | 271 } |
| 272 if(same) | 272 if (same) |
| 273 continue; | 273 continue; |
| 274 for(k = 0; k < dim; k++) | 274 for (k = 0; k < dim; k++) |
| 275 curidx += quants[k][!!(j & (1 << k))] * offs[dim - 1 - k]; | 275 curidx += quants[k][!!(j & (1 << k))] * offs[dim - 1 - k]; |
| 276 curbits = ff_aac_spectral_bits[cb-1][curidx]; | 276 curbits = ff_aac_spectral_bits[cb-1][curidx]; |
| 277 vec = &ff_aac_codebook_vectors[cb-1][curidx*dim]; | 277 vec = &ff_aac_codebook_vectors[cb-1][curidx*dim]; |
| 278 #else | 278 #else |
| 279 vec = ff_aac_codebook_vectors[cb-1]; | 279 vec = ff_aac_codebook_vectors[cb-1]; |
| 280 mincost = INFINITY; | 280 mincost = INFINITY; |
| 281 for(j = 0; j < ff_aac_spectral_sizes[cb-1]; j++, vec += dim){ | 281 for (j = 0; j < ff_aac_spectral_sizes[cb-1]; j++, vec += dim) { |
| 282 float rd = 0.0f; | 282 float rd = 0.0f; |
| 283 int curbits = ff_aac_spectral_bits[cb-1][j]; | 283 int curbits = ff_aac_spectral_bits[cb-1][j]; |
| 284 int curidx = j; | 284 int curidx = j; |
| 285 #endif /* USE_REALLY_FULL_SEARCH */ | 285 #endif /* USE_REALLY_FULL_SEARCH */ |
| 286 if(IS_CODEBOOK_UNSIGNED(cb)){ | 286 if (IS_CODEBOOK_UNSIGNED(cb)) { |
| 287 for(k = 0; k < dim; k++){ | 287 for (k = 0; k < dim; k++) { |
| 288 float t = fabsf(in[i+k]); | 288 float t = fabsf(in[i+k]); |
| 289 float di; | 289 float di; |
| 290 //do not code with escape sequence small values | 290 //do not code with escape sequence small values |
| 291 if(vec[k] == 64.0f && t < 39.0f*IQ){ | 291 if (vec[k] == 64.0f && t < 39.0f*IQ) { |
| 292 rd = INFINITY; | 292 rd = INFINITY; |
| 293 break; | 293 break; |
| 294 } | 294 } |
| 295 if(vec[k] == 64.0f){//FIXME: slow | 295 if (vec[k] == 64.0f) {//FIXME: slow |
| 296 if (t >= CLIPPED_ESCAPE) { | 296 if (t >= CLIPPED_ESCAPE) { |
| 297 di = t - CLIPPED_ESCAPE; | 297 di = t - CLIPPED_ESCAPE; |
| 298 curbits += 21; | 298 curbits += 21; |
| 299 }else{ | 299 } else { |
| 300 int c = av_clip(quant(t, Q), 0, 8191); | 300 int c = av_clip(quant(t, Q), 0, 8191); |
| 301 di = t - c*cbrt(c)*IQ; | 301 di = t - c*cbrt(c)*IQ; |
| 302 curbits += av_log2(c)*2 - 4 + 1; | 302 curbits += av_log2(c)*2 - 4 + 1; |
| 303 } | 303 } |
| 304 }else{ | 304 } else { |
| 305 di = t - vec[k]*IQ; | 305 di = t - vec[k]*IQ; |
| 306 } | 306 } |
| 307 if(vec[k] != 0.0f) | 307 if (vec[k] != 0.0f) |
| 308 curbits++; | 308 curbits++; |
| 309 rd += di*di*lambda; | 309 rd += di*di*lambda; |
| 310 } | 310 } |
| 311 }else{ | 311 } else { |
| 312 for(k = 0; k < dim; k++){ | 312 for (k = 0; k < dim; k++) { |
| 313 float di = in[i+k] - vec[k]*IQ; | 313 float di = in[i+k] - vec[k]*IQ; |
| 314 rd += di*di*lambda; | 314 rd += di*di*lambda; |
| 315 } | 315 } |
| 316 } | 316 } |
| 317 rd += curbits; | 317 rd += curbits; |
| 318 if(rd < mincost){ | 318 if (rd < mincost) { |
| 319 mincost = rd; | 319 mincost = rd; |
| 320 minidx = curidx; | 320 minidx = curidx; |
| 321 minbits = curbits; | 321 minbits = curbits; |
| 322 } | 322 } |
| 323 } | 323 } |
| 324 put_bits(pb, ff_aac_spectral_bits[cb-1][minidx], ff_aac_spectral_codes[cb-1][minidx]); | 324 put_bits(pb, ff_aac_spectral_bits[cb-1][minidx], ff_aac_spectral_codes[cb-1][minidx]); |
| 325 if(IS_CODEBOOK_UNSIGNED(cb)) | 325 if (IS_CODEBOOK_UNSIGNED(cb)) |
| 326 for(j = 0; j < dim; j++) | 326 for (j = 0; j < dim; j++) |
| 327 if(ff_aac_codebook_vectors[cb-1][minidx*dim+j] != 0.0f) | 327 if (ff_aac_codebook_vectors[cb-1][minidx*dim+j] != 0.0f) |
| 328 put_bits(pb, 1, in[i+j] < 0.0f); | 328 put_bits(pb, 1, in[i+j] < 0.0f); |
| 329 if(cb == ESC_BT){ | 329 if (cb == ESC_BT) { |
| 330 for(j = 0; j < 2; j++){ | 330 for (j = 0; j < 2; j++) { |
| 331 if(ff_aac_codebook_vectors[cb-1][minidx*2+j] == 64.0f){ | 331 if (ff_aac_codebook_vectors[cb-1][minidx*2+j] == 64.0f) { |
| 332 int coef = av_clip(quant(fabsf(in[i+j]), Q), 0, 8191); | 332 int coef = av_clip(quant(fabsf(in[i+j]), Q), 0, 8191); |
| 333 int len = av_log2(coef); | 333 int len = av_log2(coef); |
| 334 | 334 |
| 335 put_bits(pb, len - 4 + 1, (1 << (len - 4 + 1)) - 2); | 335 put_bits(pb, len - 4 + 1, (1 << (len - 4 + 1)) - 2); |
| 336 put_bits(pb, len, coef & ((1 << len) - 1)); | 336 put_bits(pb, len, coef & ((1 << len) - 1)); |
| 368 float next_minrd = INFINITY; | 368 float next_minrd = INFINITY; |
| 369 int next_mincb = 0; | 369 int next_mincb = 0; |
| 370 | 370 |
| 371 abs_pow34_v(s->scoefs, sce->coeffs, 1024); | 371 abs_pow34_v(s->scoefs, sce->coeffs, 1024); |
| 372 start = win*128; | 372 start = win*128; |
| 373 for(cb = 0; cb < 12; cb++){ | 373 for (cb = 0; cb < 12; cb++) { |
| 374 path[0][cb].cost = 0.0f; | 374 path[0][cb].cost = 0.0f; |
| 375 path[0][cb].prev_idx = -1; | 375 path[0][cb].prev_idx = -1; |
| 376 path[0][cb].run = 0; | 376 path[0][cb].run = 0; |
| 377 } | 377 } |
| 378 for(swb = 0; swb < max_sfb; swb++){ | 378 for (swb = 0; swb < max_sfb; swb++) { |
| 379 start2 = start; | 379 start2 = start; |
| 380 size = sce->ics.swb_sizes[swb]; | 380 size = sce->ics.swb_sizes[swb]; |
| 381 if(sce->zeroes[win*16 + swb]){ | 381 if (sce->zeroes[win*16 + swb]) { |
| 382 for(cb = 0; cb < 12; cb++){ | 382 for (cb = 0; cb < 12; cb++) { |
| 383 path[swb+1][cb].prev_idx = cb; | 383 path[swb+1][cb].prev_idx = cb; |
| 384 path[swb+1][cb].cost = path[swb][cb].cost; | 384 path[swb+1][cb].cost = path[swb][cb].cost; |
| 385 path[swb+1][cb].run = path[swb][cb].run + 1; | 385 path[swb+1][cb].run = path[swb][cb].run + 1; |
| 386 } | 386 } |
| 387 }else{ | 387 } else { |
| 388 float minrd = next_minrd; | 388 float minrd = next_minrd; |
| 389 int mincb = next_mincb; | 389 int mincb = next_mincb; |
| 390 next_minrd = INFINITY; | 390 next_minrd = INFINITY; |
| 391 next_mincb = 0; | 391 next_mincb = 0; |
| 392 for(cb = 0; cb < 12; cb++){ | 392 for (cb = 0; cb < 12; cb++) { |
| 393 float cost_stay_here, cost_get_here; | 393 float cost_stay_here, cost_get_here; |
| 394 float rd = 0.0f; | 394 float rd = 0.0f; |
| 395 for(w = 0; w < group_len; w++){ | 395 for (w = 0; w < group_len; w++) { |
| 396 FFPsyBand *band = &s->psy.psy_bands[s->cur_channel*PSY_MAX_BANDS+(win+w)*16+swb]; | 396 FFPsyBand *band = &s->psy.psy_bands[s->cur_channel*PSY_MAX_BANDS+(win+w)*16+swb]; |
| 397 rd += quantize_band_cost(s, sce->coeffs + start + w*128, | 397 rd += quantize_band_cost(s, sce->coeffs + start + w*128, |
| 398 s->scoefs + start + w*128, size, | 398 s->scoefs + start + w*128, size, |
| 399 sce->sf_idx[(win+w)*16+swb], cb, | 399 sce->sf_idx[(win+w)*16+swb], cb, |
| 400 lambda / band->threshold, INFINITY, NULL); | 400 lambda / band->threshold, INFINITY, NULL); |
| 401 } | 401 } |
| 402 cost_stay_here = path[swb][cb].cost + rd; | 402 cost_stay_here = path[swb][cb].cost + rd; |
| 403 cost_get_here = minrd + rd + run_bits + 4; | 403 cost_get_here = minrd + rd + run_bits + 4; |
| 404 if( run_value_bits[sce->ics.num_windows == 8][path[swb][cb].run] | 404 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]) | 405 != run_value_bits[sce->ics.num_windows == 8][path[swb][cb].run+1]) |
| 406 cost_stay_here += run_bits; | 406 cost_stay_here += run_bits; |
| 407 if (cost_get_here < cost_stay_here) { | 407 if (cost_get_here < cost_stay_here) { |
| 408 path[swb+1][cb].prev_idx = mincb; | 408 path[swb+1][cb].prev_idx = mincb; |
| 409 path[swb+1][cb].cost = cost_get_here; | 409 path[swb+1][cb].cost = cost_get_here; |
| 423 } | 423 } |
| 424 | 424 |
| 425 //convert resulting path from backward-linked list | 425 //convert resulting path from backward-linked list |
| 426 stack_len = 0; | 426 stack_len = 0; |
| 427 idx = 0; | 427 idx = 0; |
| 428 for(cb = 1; cb < 12; cb++){ | 428 for (cb = 1; cb < 12; cb++) { |
| 429 if(path[max_sfb][cb].cost < path[max_sfb][idx].cost) | 429 if (path[max_sfb][cb].cost < path[max_sfb][idx].cost) |
| 430 idx = cb; | 430 idx = cb; |
| 431 } | 431 } |
| 432 ppos = max_sfb; | 432 ppos = max_sfb; |
| 433 while(ppos > 0){ | 433 while(ppos > 0) { |
| 434 cb = idx; | 434 cb = idx; |
| 435 stackrun[stack_len] = path[ppos][cb].run; | 435 stackrun[stack_len] = path[ppos][cb].run; |
| 436 stackcb [stack_len] = cb; | 436 stackcb [stack_len] = cb; |
| 437 idx = path[ppos-path[ppos][cb].run+1][cb].prev_idx; | 437 idx = path[ppos-path[ppos][cb].run+1][cb].prev_idx; |
| 438 ppos -= path[ppos][cb].run; | 438 ppos -= path[ppos][cb].run; |
| 439 stack_len++; | 439 stack_len++; |
| 440 } | 440 } |
| 441 //perform actual band info encoding | 441 //perform actual band info encoding |
| 442 start = 0; | 442 start = 0; |
| 443 for(i = stack_len - 1; i >= 0; i--){ | 443 for (i = stack_len - 1; i >= 0; i--) { |
| 444 put_bits(&s->pb, 4, stackcb[i]); | 444 put_bits(&s->pb, 4, stackcb[i]); |
| 445 count = stackrun[i]; | 445 count = stackrun[i]; |
| 446 memset(sce->zeroes + win*16 + start, !stackcb[i], count); | 446 memset(sce->zeroes + win*16 + start, !stackcb[i], count); |
| 447 //XXX: memset when band_type is also uint8_t | 447 //XXX: memset when band_type is also uint8_t |
| 448 for(j = 0; j < count; j++){ | 448 for (j = 0; j < count; j++) { |
| 449 sce->band_type[win*16 + start] = stackcb[i]; | 449 sce->band_type[win*16 + start] = stackcb[i]; |
| 450 start++; | 450 start++; |
| 451 } | 451 } |
| 452 while(count >= run_esc){ | 452 while(count >= run_esc) { |
| 453 put_bits(&s->pb, run_bits, run_esc); | 453 put_bits(&s->pb, run_bits, run_esc); |
| 454 count -= run_esc; | 454 count -= run_esc; |
| 455 } | 455 } |
| 456 put_bits(&s->pb, run_bits, count); | 456 put_bits(&s->pb, run_bits, count); |
| 457 } | 457 } |
| 480 TrellisPath paths[256*121]; | 480 TrellisPath paths[256*121]; |
| 481 int bandaddr[121]; | 481 int bandaddr[121]; |
| 482 int minq; | 482 int minq; |
| 483 float mincost; | 483 float mincost; |
| 484 | 484 |
| 485 for(i = 0; i < 256; i++){ | 485 for (i = 0; i < 256; i++) { |
| 486 paths[i].cost = 0.0f; | 486 paths[i].cost = 0.0f; |
| 487 paths[i].prev = -1; | 487 paths[i].prev = -1; |
| 488 paths[i].min_val = i; | 488 paths[i].min_val = i; |
| 489 paths[i].max_val = i; | 489 paths[i].max_val = i; |
| 490 } | 490 } |
| 491 for(i = 256; i < 256*121; i++){ | 491 for (i = 256; i < 256*121; i++) { |
| 492 paths[i].cost = INFINITY; | 492 paths[i].cost = INFINITY; |
| 493 paths[i].prev = -2; | 493 paths[i].prev = -2; |
| 494 paths[i].min_val = INT_MAX; | 494 paths[i].min_val = INT_MAX; |
| 495 paths[i].max_val = 0; | 495 paths[i].max_val = 0; |
| 496 } | 496 } |
| 497 idx = 256; | 497 idx = 256; |
| 498 abs_pow34_v(s->scoefs, sce->coeffs, 1024); | 498 abs_pow34_v(s->scoefs, sce->coeffs, 1024); |
| 499 for(w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]){ | 499 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
| 500 start = w*128; | 500 start = w*128; |
| 501 for(g = 0; g < sce->ics.num_swb; g++){ | 501 for (g = 0; g < sce->ics.num_swb; g++) { |
| 502 const float *coefs = sce->coeffs + start; | 502 const float *coefs = sce->coeffs + start; |
| 503 float qmin, qmax; | 503 float qmin, qmax; |
| 504 int nz = 0; | 504 int nz = 0; |
| 505 | 505 |
| 506 bandaddr[idx >> 8] = w*16+g; | 506 bandaddr[idx >> 8] = w*16+g; |
| 507 qmin = INT_MAX; | 507 qmin = INT_MAX; |
| 508 qmax = 0.0f; | 508 qmax = 0.0f; |
| 509 for(w2 = 0; w2 < sce->ics.group_len[w]; w2++){ | 509 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]; | 510 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){ | 511 if (band->energy <= band->threshold || band->threshold == 0.0f) { |
| 512 sce->zeroes[(w+w2)*16+g] = 1; | 512 sce->zeroes[(w+w2)*16+g] = 1; |
| 513 continue; | 513 continue; |
| 514 } | 514 } |
| 515 sce->zeroes[(w+w2)*16+g] = 0; | 515 sce->zeroes[(w+w2)*16+g] = 0; |
| 516 nz = 1; | 516 nz = 1; |
| 517 for(i = 0; i < sce->ics.swb_sizes[g]; i++){ | 517 for (i = 0; i < sce->ics.swb_sizes[g]; i++) { |
| 518 float t = fabsf(coefs[w2*128+i]); | 518 float t = fabsf(coefs[w2*128+i]); |
| 519 if(t > 0.0f) qmin = fminf(qmin, t); | 519 if (t > 0.0f) qmin = fminf(qmin, t); |
| 520 qmax = fmaxf(qmax, t); | 520 qmax = fmaxf(qmax, t); |
| 521 } | 521 } |
| 522 } | 522 } |
| 523 if(nz){ | 523 if (nz) { |
| 524 int minscale, maxscale; | 524 int minscale, maxscale; |
| 525 float minrd = INFINITY; | 525 float minrd = INFINITY; |
| 526 //minimum scalefactor index is when minimum nonzero coefficient after quantizing is not clipped | 526 //minimum scalefactor index is when minimum nonzero coefficient after quantizing is not clipped |
| 527 minscale = av_clip_uint8(log2(qmin)*4 - 69 + SCALE_ONE_POS - SCALE_DIV_512); | 527 minscale = av_clip_uint8(log2(qmin)*4 - 69 + SCALE_ONE_POS - SCALE_DIV_512); |
| 528 //maximum scalefactor index is when maximum coefficient after quantizing is still not zero | 528 //maximum scalefactor index is when maximum coefficient after quantizing is still not zero |
| 529 maxscale = av_clip_uint8(log2(qmax)*4 + 6 + SCALE_ONE_POS - SCALE_DIV_512); | 529 maxscale = av_clip_uint8(log2(qmax)*4 + 6 + SCALE_ONE_POS - SCALE_DIV_512); |
| 530 for(q = minscale; q < maxscale; q++){ | 530 for (q = minscale; q < maxscale; q++) { |
| 531 float dists[12], dist; | 531 float dists[12], dist; |
| 532 memset(dists, 0, sizeof(dists)); | 532 memset(dists, 0, sizeof(dists)); |
| 533 for(w2 = 0; w2 < sce->ics.group_len[w]; w2++){ | 533 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { |
| 534 FFPsyBand *band = &s->psy.psy_bands[s->cur_channel*PSY_MAX_BANDS+(w+w2)*16+g]; | 534 FFPsyBand *band = &s->psy.psy_bands[s->cur_channel*PSY_MAX_BANDS+(w+w2)*16+g]; |
| 535 int cb; | 535 int cb; |
| 536 for(cb = 0; cb <= ESC_BT; cb++){ | 536 for (cb = 0; cb <= ESC_BT; cb++) { |
| 537 dists[cb] += quantize_band_cost(s, coefs + w2*128, s->scoefs + start + w2*128, sce->ics.swb_sizes[g], | 537 dists[cb] += quantize_band_cost(s, coefs + w2*128, s->scoefs + start + w2*128, sce->ics.swb_sizes[g], |
| 538 q, cb, lambda / band->threshold, INFINITY, NULL); | 538 q, cb, lambda / band->threshold, INFINITY, NULL); |
| 539 } | 539 } |
| 540 } | 540 } |
| 541 dist = dists[0]; | 541 dist = dists[0]; |
| 542 for(i = 1; i <= ESC_BT; i++) | 542 for (i = 1; i <= ESC_BT; i++) |
| 543 dist = fminf(dist, dists[i]); | 543 dist = fminf(dist, dists[i]); |
| 544 minrd = fminf(minrd, dist); | 544 minrd = fminf(minrd, dist); |
| 545 | 545 |
| 546 for(i = FFMAX(q - SCALE_MAX_DIFF, 0); i < FFMIN(q + SCALE_MAX_DIFF, 256); i++){ | 546 for (i = FFMAX(q - SCALE_MAX_DIFF, 0); i < FFMIN(q + SCALE_MAX_DIFF, 256); i++) { |
| 547 float cost; | 547 float cost; |
| 548 int minv, maxv; | 548 int minv, maxv; |
| 549 if(isinf(paths[idx - 256 + i].cost)) | 549 if (isinf(paths[idx - 256 + i].cost)) |
| 550 continue; | 550 continue; |
| 551 cost = paths[idx - 256 + i].cost + dist | 551 cost = paths[idx - 256 + i].cost + dist |
| 552 + ff_aac_scalefactor_bits[q - i + SCALE_DIFF_ZERO]; | 552 + ff_aac_scalefactor_bits[q - i + SCALE_DIFF_ZERO]; |
| 553 minv = FFMIN(paths[idx - 256 + i].min_val, q); | 553 minv = FFMIN(paths[idx - 256 + i].min_val, q); |
| 554 maxv = FFMAX(paths[idx - 256 + i].max_val, q); | 554 maxv = FFMAX(paths[idx - 256 + i].max_val, q); |
| 555 if(cost < paths[idx + q].cost && maxv-minv < SCALE_MAX_DIFF){ | 555 if (cost < paths[idx + q].cost && maxv-minv < SCALE_MAX_DIFF) { |
| 556 paths[idx + q].cost = cost; | 556 paths[idx + q].cost = cost; |
| 557 paths[idx + q].prev = idx - 256 + i; | 557 paths[idx + q].prev = idx - 256 + i; |
| 558 paths[idx + q].min_val = minv; | 558 paths[idx + q].min_val = minv; |
| 559 paths[idx + q].max_val = maxv; | 559 paths[idx + q].max_val = maxv; |
| 560 } | 560 } |
| 561 } | 561 } |
| 562 } | 562 } |
| 563 }else{ | 563 } else { |
| 564 for(q = 0; q < 256; q++){ | 564 for (q = 0; q < 256; q++) { |
| 565 if(!isinf(paths[idx - 256 + q].cost)){ | 565 if (!isinf(paths[idx - 256 + q].cost)) { |
| 566 paths[idx + q].cost = paths[idx - 256 + q].cost + 1; | 566 paths[idx + q].cost = paths[idx - 256 + q].cost + 1; |
| 567 paths[idx + q].prev = idx - 256 + q; | 567 paths[idx + q].prev = idx - 256 + q; |
| 568 paths[idx + q].min_val = FFMIN(paths[idx - 256 + q].min_val, q); | 568 paths[idx + q].min_val = FFMIN(paths[idx - 256 + q].min_val, q); |
| 569 paths[idx + q].max_val = FFMAX(paths[idx - 256 + q].max_val, q); | 569 paths[idx + q].max_val = FFMAX(paths[idx - 256 + q].max_val, q); |
| 570 continue; | 570 continue; |
| 571 } | 571 } |
| 572 for(i = FFMAX(q - SCALE_MAX_DIFF, 0); i < FFMIN(q + SCALE_MAX_DIFF, 256); i++){ | 572 for (i = FFMAX(q - SCALE_MAX_DIFF, 0); i < FFMIN(q + SCALE_MAX_DIFF, 256); i++) { |
| 573 float cost; | 573 float cost; |
| 574 int minv, maxv; | 574 int minv, maxv; |
| 575 if(isinf(paths[idx - 256 + i].cost)) | 575 if (isinf(paths[idx - 256 + i].cost)) |
| 576 continue; | 576 continue; |
| 577 cost = paths[idx - 256 + i].cost + ff_aac_scalefactor_bits[q - i + SCALE_DIFF_ZERO]; | 577 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); | 578 minv = FFMIN(paths[idx - 256 + i].min_val, q); |
| 579 maxv = FFMAX(paths[idx - 256 + i].max_val, q); | 579 maxv = FFMAX(paths[idx - 256 + i].max_val, q); |
| 580 if(cost < paths[idx + q].cost && maxv-minv < SCALE_MAX_DIFF){ | 580 if (cost < paths[idx + q].cost && maxv-minv < SCALE_MAX_DIFF) { |
| 581 paths[idx + q].cost = cost; | 581 paths[idx + q].cost = cost; |
| 582 paths[idx + q].prev = idx - 256 + i; | 582 paths[idx + q].prev = idx - 256 + i; |
| 583 paths[idx + q].min_val = minv; | 583 paths[idx + q].min_val = minv; |
| 584 paths[idx + q].max_val = maxv; | 584 paths[idx + q].max_val = maxv; |
| 585 } | 585 } |
| 592 } | 592 } |
| 593 } | 593 } |
| 594 idx -= 256; | 594 idx -= 256; |
| 595 mincost = paths[idx].cost; | 595 mincost = paths[idx].cost; |
| 596 minq = idx; | 596 minq = idx; |
| 597 for(i = 1; i < 256; i++){ | 597 for (i = 1; i < 256; i++) { |
| 598 if(paths[idx + i].cost < mincost){ | 598 if (paths[idx + i].cost < mincost) { |
| 599 mincost = paths[idx + i].cost; | 599 mincost = paths[idx + i].cost; |
| 600 minq = idx + i; | 600 minq = idx + i; |
| 601 } | 601 } |
| 602 } | 602 } |
| 603 while(minq >= 256){ | 603 while(minq >= 256) { |
| 604 sce->sf_idx[bandaddr[minq>>8]] = minq & 0xFF; | 604 sce->sf_idx[bandaddr[minq>>8]] = minq & 0xFF; |
| 605 minq = paths[minq].prev; | 605 minq = paths[minq].prev; |
| 606 } | 606 } |
| 607 //set the same quantizers inside window groups | 607 //set the same quantizers inside window groups |
| 608 for(w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) | 608 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) |
| 609 for(g = 0; g < sce->ics.num_swb; g++) | 609 for (g = 0; g < sce->ics.num_swb; g++) |
| 610 for(w2 = 1; w2 < sce->ics.group_len[w]; w2++) | 610 for (w2 = 1; w2 < sce->ics.group_len[w]; w2++) |
| 611 sce->sf_idx[(w+w2)*16+g] = sce->sf_idx[w*16+g]; | 611 sce->sf_idx[(w+w2)*16+g] = sce->sf_idx[w*16+g]; |
| 612 } | 612 } |
| 613 | 613 |
| 614 /** | 614 /** |
| 615 * two-loop quantizers search taken from ISO 13818-7 Appendix C | 615 * two-loop quantizers search taken from ISO 13818-7 Appendix C |
| 626 float minthr = INFINITY; | 626 float minthr = INFINITY; |
| 627 | 627 |
| 628 //XXX: some heuristic to determine initial quantizers will reduce search time | 628 //XXX: some heuristic to determine initial quantizers will reduce search time |
| 629 memset(dists, 0, sizeof(dists)); | 629 memset(dists, 0, sizeof(dists)); |
| 630 //determine zero bands and upper limits | 630 //determine zero bands and upper limits |
| 631 for(w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]){ | 631 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
| 632 for(g = 0; g < sce->ics.num_swb; g++){ | 632 for (g = 0; g < sce->ics.num_swb; g++) { |
| 633 int nz = 0; | 633 int nz = 0; |
| 634 float uplim = 0.0f; | 634 float uplim = 0.0f; |
| 635 for(w2 = 0; w2 < sce->ics.group_len[w]; w2++){ | 635 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { |
| 636 FFPsyBand *band = &s->psy.psy_bands[s->cur_channel*PSY_MAX_BANDS+(w+w2)*16+g]; | 636 FFPsyBand *band = &s->psy.psy_bands[s->cur_channel*PSY_MAX_BANDS+(w+w2)*16+g]; |
| 637 uplim += band->threshold; | 637 uplim += band->threshold; |
| 638 if(band->energy <= band->threshold || band->threshold == 0.0f){ | 638 if (band->energy <= band->threshold || band->threshold == 0.0f) { |
| 639 sce->zeroes[(w+w2)*16+g] = 1; | 639 sce->zeroes[(w+w2)*16+g] = 1; |
| 640 continue; | 640 continue; |
| 641 } | 641 } |
| 642 nz = 1; | 642 nz = 1; |
| 643 } | 643 } |
| 644 uplims[w*16+g] = uplim *512; | 644 uplims[w*16+g] = uplim *512; |
| 645 sce->zeroes[w*16+g] = !nz; | 645 sce->zeroes[w*16+g] = !nz; |
| 646 if(nz) | 646 if (nz) |
| 647 minthr = fminf(minthr, uplim); | 647 minthr = fminf(minthr, uplim); |
| 648 allz = FFMAX(allz, nz); | 648 allz = FFMAX(allz, nz); |
| 649 } | 649 } |
| 650 } | 650 } |
| 651 for(w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]){ | 651 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
| 652 for(g = 0; g < sce->ics.num_swb; g++){ | 652 for (g = 0; g < sce->ics.num_swb; g++) { |
| 653 if(sce->zeroes[w*16+g]){ | 653 if (sce->zeroes[w*16+g]) { |
| 654 sce->sf_idx[w*16+g] = SCALE_ONE_POS; | 654 sce->sf_idx[w*16+g] = SCALE_ONE_POS; |
| 655 continue; | 655 continue; |
| 656 } | 656 } |
| 657 sce->sf_idx[w*16+g] = SCALE_ONE_POS + fminf(log2(uplims[w*16+g]/minthr)*4,59); | 657 sce->sf_idx[w*16+g] = SCALE_ONE_POS + fminf(log2(uplims[w*16+g]/minthr)*4,59); |
| 658 } | 658 } |
| 659 } | 659 } |
| 660 | 660 |
| 661 if(!allz) | 661 if (!allz) |
| 662 return; | 662 return; |
| 663 abs_pow34_v(s->scoefs, sce->coeffs, 1024); | 663 abs_pow34_v(s->scoefs, sce->coeffs, 1024); |
| 664 //perform two-loop search | 664 //perform two-loop search |
| 665 //outer loop - improve quality | 665 //outer loop - improve quality |
| 666 do{ | 666 do{ |
| 670 qstep = its ? 1 : 32; | 670 qstep = its ? 1 : 32; |
| 671 do{ | 671 do{ |
| 672 int prev = -1; | 672 int prev = -1; |
| 673 tbits = 0; | 673 tbits = 0; |
| 674 fflag = 0; | 674 fflag = 0; |
| 675 for(w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]){ | 675 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
| 676 start = w*128; | 676 start = w*128; |
| 677 for(g = 0; g < sce->ics.num_swb; g++){ | 677 for (g = 0; g < sce->ics.num_swb; g++) { |
| 678 const float *coefs = sce->coeffs + start; | 678 const float *coefs = sce->coeffs + start; |
| 679 const float *scaled = s->scoefs + start; | 679 const float *scaled = s->scoefs + start; |
| 680 int bits = 0; | 680 int bits = 0; |
| 681 int cb; | 681 int cb; |
| 682 float mindist = INFINITY; | 682 float mindist = INFINITY; |
| 683 int minbits = 0; | 683 int minbits = 0; |
| 684 | 684 |
| 685 if(sce->zeroes[w*16+g] || sce->sf_idx[w*16+g] >= 218) | 685 if (sce->zeroes[w*16+g] || sce->sf_idx[w*16+g] >= 218) |
| 686 continue; | 686 continue; |
| 687 minscaler = FFMIN(minscaler, sce->sf_idx[w*16+g]); | 687 minscaler = FFMIN(minscaler, sce->sf_idx[w*16+g]); |
| 688 for(cb = 0; cb <= ESC_BT; cb++){ | 688 for (cb = 0; cb <= ESC_BT; cb++) { |
| 689 float dist = 0.0f; | 689 float dist = 0.0f; |
| 690 int bb = 0; | 690 int bb = 0; |
| 691 for(w2 = 0; w2 < sce->ics.group_len[w]; w2++){ | 691 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { |
| 692 int b; | 692 int b; |
| 693 dist += quantize_band_cost(s, coefs + w2*128, | 693 dist += quantize_band_cost(s, coefs + w2*128, |
| 694 scaled + w2*128, | 694 scaled + w2*128, |
| 695 sce->ics.swb_sizes[g], | 695 sce->ics.swb_sizes[g], |
| 696 sce->sf_idx[w*16+g], | 696 sce->sf_idx[w*16+g], |
| 698 1.0, | 698 1.0, |
| 699 INFINITY, | 699 INFINITY, |
| 700 &b); | 700 &b); |
| 701 bb += b; | 701 bb += b; |
| 702 } | 702 } |
| 703 if(dist < mindist){ | 703 if (dist < mindist) { |
| 704 mindist = dist; | 704 mindist = dist; |
| 705 minbits = bb; | 705 minbits = bb; |
| 706 } | 706 } |
| 707 } | 707 } |
| 708 dists[w*16+g] = mindist - minbits; | 708 dists[w*16+g] = mindist - minbits; |
| 709 bits = minbits; | 709 bits = minbits; |
| 710 if(prev != -1){ | 710 if (prev != -1) { |
| 711 bits += ff_aac_scalefactor_bits[sce->sf_idx[w*16+g] - prev + SCALE_DIFF_ZERO]; | 711 bits += ff_aac_scalefactor_bits[sce->sf_idx[w*16+g] - prev + SCALE_DIFF_ZERO]; |
| 712 } | 712 } |
| 713 tbits += bits; | 713 tbits += bits; |
| 714 start += sce->ics.swb_sizes[g]; | 714 start += sce->ics.swb_sizes[g]; |
| 715 prev = sce->sf_idx[w*16+g]; | 715 prev = sce->sf_idx[w*16+g]; |
| 716 } | 716 } |
| 717 } | 717 } |
| 718 if(tbits > destbits){ | 718 if (tbits > destbits) { |
| 719 for(i = 0; i < 128; i++){ | 719 for (i = 0; i < 128; i++) { |
| 720 if(sce->sf_idx[i] < 218 - qstep){ | 720 if (sce->sf_idx[i] < 218 - qstep) { |
| 721 sce->sf_idx[i] += qstep; | 721 sce->sf_idx[i] += qstep; |
| 722 } | 722 } |
| 723 } | 723 } |
| 724 }else{ | 724 } else { |
| 725 for(i = 0; i < 128; i++){ | 725 for (i = 0; i < 128; i++) { |
| 726 if(sce->sf_idx[i] > 60 - qstep){ | 726 if (sce->sf_idx[i] > 60 - qstep) { |
| 727 sce->sf_idx[i] -= qstep; | 727 sce->sf_idx[i] -= qstep; |
| 728 } | 728 } |
| 729 } | 729 } |
| 730 } | 730 } |
| 731 qstep >>= 1; | 731 qstep >>= 1; |
| 732 if(!qstep && tbits > destbits*1.02) | 732 if (!qstep && tbits > destbits*1.02) |
| 733 qstep = 1; | 733 qstep = 1; |
| 734 if(sce->sf_idx[0] >= 217)break; | 734 if (sce->sf_idx[0] >= 217)break; |
| 735 }while(qstep); | 735 }while(qstep); |
| 736 | 736 |
| 737 fflag = 0; | 737 fflag = 0; |
| 738 minscaler = av_clip(minscaler, 60, 255 - SCALE_MAX_DIFF); | 738 minscaler = av_clip(minscaler, 60, 255 - SCALE_MAX_DIFF); |
| 739 for(w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]){ | 739 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
| 740 start = w*128; | 740 start = w*128; |
| 741 for(g = 0; g < sce->ics.num_swb; g++){ | 741 for (g = 0; g < sce->ics.num_swb; g++) { |
| 742 int prevsc = sce->sf_idx[w*16+g]; | 742 int prevsc = sce->sf_idx[w*16+g]; |
| 743 if(dists[w*16+g] > uplims[w*16+g] && sce->sf_idx[w*16+g] > 60) | 743 if (dists[w*16+g] > uplims[w*16+g] && sce->sf_idx[w*16+g] > 60) |
| 744 sce->sf_idx[w*16+g]--; | 744 sce->sf_idx[w*16+g]--; |
| 745 sce->sf_idx[w*16+g] = av_clip(sce->sf_idx[w*16+g], minscaler, minscaler + SCALE_MAX_DIFF); | 745 sce->sf_idx[w*16+g] = av_clip(sce->sf_idx[w*16+g], minscaler, minscaler + SCALE_MAX_DIFF); |
| 746 sce->sf_idx[w*16+g] = FFMIN(sce->sf_idx[w*16+g], 219); | 746 sce->sf_idx[w*16+g] = FFMIN(sce->sf_idx[w*16+g], 219); |
| 747 if(sce->sf_idx[w*16+g] != prevsc) | 747 if (sce->sf_idx[w*16+g] != prevsc) |
| 748 fflag = 1; | 748 fflag = 1; |
| 749 } | 749 } |
| 750 } | 750 } |
| 751 its++; | 751 its++; |
| 752 }while(fflag && its < 10); | 752 }while(fflag && its < 10); |
| 759 float uplim[128], maxq[128]; | 759 float uplim[128], maxq[128]; |
| 760 int minq, maxsf; | 760 int minq, maxsf; |
| 761 float distfact = ((sce->ics.num_windows > 1) ? 85.80 : 147.84) / lambda; | 761 float distfact = ((sce->ics.num_windows > 1) ? 85.80 : 147.84) / lambda; |
| 762 int last = 0, lastband = 0, curband = 0; | 762 int last = 0, lastband = 0, curband = 0; |
| 763 float avg_energy = 0.0; | 763 float avg_energy = 0.0; |
| 764 if(sce->ics.num_windows == 1){ | 764 if (sce->ics.num_windows == 1) { |
| 765 start = 0; | 765 start = 0; |
| 766 for(i = 0; i < 1024; i++){ | 766 for (i = 0; i < 1024; i++) { |
| 767 if(i - start >= sce->ics.swb_sizes[curband]){ | 767 if (i - start >= sce->ics.swb_sizes[curband]) { |
| 768 start += sce->ics.swb_sizes[curband]; | 768 start += sce->ics.swb_sizes[curband]; |
| 769 curband++; | 769 curband++; |
| 770 } | 770 } |
| 771 if(sce->coeffs[i]){ | 771 if (sce->coeffs[i]) { |
| 772 avg_energy += sce->coeffs[i] * sce->coeffs[i]; | 772 avg_energy += sce->coeffs[i] * sce->coeffs[i]; |
| 773 last = i; | 773 last = i; |
| 774 lastband = curband; | 774 lastband = curband; |
| 775 } | 775 } |
| 776 } | 776 } |
| 777 }else{ | 777 } else { |
| 778 for(w = 0; w < 8; w++){ | 778 for (w = 0; w < 8; w++) { |
| 779 const float *coeffs = sce->coeffs + w*128; | 779 const float *coeffs = sce->coeffs + w*128; |
| 780 start = 0; | 780 start = 0; |
| 781 for(i = 0; i < 128; i++){ | 781 for (i = 0; i < 128; i++) { |
| 782 if(i - start >= sce->ics.swb_sizes[curband]){ | 782 if (i - start >= sce->ics.swb_sizes[curband]) { |
| 783 start += sce->ics.swb_sizes[curband]; | 783 start += sce->ics.swb_sizes[curband]; |
| 784 curband++; | 784 curband++; |
| 785 } | 785 } |
| 786 if(coeffs[i]){ | 786 if (coeffs[i]) { |
| 787 avg_energy += coeffs[i] * coeffs[i]; | 787 avg_energy += coeffs[i] * coeffs[i]; |
| 788 last = FFMAX(last, i); | 788 last = FFMAX(last, i); |
| 789 lastband = FFMAX(lastband, curband); | 789 lastband = FFMAX(lastband, curband); |
| 790 } | 790 } |
| 791 } | 791 } |
| 792 } | 792 } |
| 793 } | 793 } |
| 794 last++; | 794 last++; |
| 795 avg_energy /= last; | 795 avg_energy /= last; |
| 796 if(avg_energy == 0.0f){ | 796 if (avg_energy == 0.0f) { |
| 797 for(i = 0; i < FF_ARRAY_ELEMS(sce->sf_idx); i++) | 797 for (i = 0; i < FF_ARRAY_ELEMS(sce->sf_idx); i++) |
| 798 sce->sf_idx[i] = SCALE_ONE_POS; | 798 sce->sf_idx[i] = SCALE_ONE_POS; |
| 799 return; | 799 return; |
| 800 } | 800 } |
| 801 for(w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]){ | 801 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
| 802 start = w*128; | 802 start = w*128; |
| 803 for(g = 0; g < sce->ics.num_swb; g++){ | 803 for (g = 0; g < sce->ics.num_swb; g++) { |
| 804 float *coefs = sce->coeffs + start; | 804 float *coefs = sce->coeffs + start; |
| 805 const int size = sce->ics.swb_sizes[g]; | 805 const int size = sce->ics.swb_sizes[g]; |
| 806 int start2 = start, end2 = start + size, peakpos = start; | 806 int start2 = start, end2 = start + size, peakpos = start; |
| 807 float maxval = -1, thr = 0.0f, t; | 807 float maxval = -1, thr = 0.0f, t; |
| 808 maxq[w*16+g] = 0.0f; | 808 maxq[w*16+g] = 0.0f; |
| 809 if(g > lastband){ | 809 if (g > lastband) { |
| 810 maxq[w*16+g] = 0.0f; | 810 maxq[w*16+g] = 0.0f; |
| 811 start += size; | 811 start += size; |
| 812 for(w2 = 0; w2 < sce->ics.group_len[w]; w2++) | 812 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) |
| 813 memset(coefs + w2*128, 0, sizeof(coefs[0])*size); | 813 memset(coefs + w2*128, 0, sizeof(coefs[0])*size); |
| 814 continue; | 814 continue; |
| 815 } | 815 } |
| 816 for(w2 = 0; w2 < sce->ics.group_len[w]; w2++){ | 816 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { |
| 817 for(i = 0; i < size; i++){ | 817 for (i = 0; i < size; i++) { |
| 818 float t = coefs[w2*128+i]*coefs[w2*128+i]; | 818 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])); | 819 maxq[w*16+g] = fmaxf(maxq[w*16+g], fabsf(coefs[w2*128 + i])); |
| 820 thr += t; | 820 thr += t; |
| 821 if(sce->ics.num_windows == 1 && maxval < t){ | 821 if (sce->ics.num_windows == 1 && maxval < t) { |
| 822 maxval = t; | 822 maxval = t; |
| 823 peakpos = start+i; | 823 peakpos = start+i; |
| 824 } | 824 } |
| 825 } | 825 } |
| 826 } | 826 } |
| 827 if(sce->ics.num_windows == 1){ | 827 if (sce->ics.num_windows == 1) { |
| 828 start2 = FFMAX(peakpos - 2, start2); | 828 start2 = FFMAX(peakpos - 2, start2); |
| 829 end2 = FFMIN(peakpos + 3, end2); | 829 end2 = FFMIN(peakpos + 3, end2); |
| 830 }else{ | 830 } else { |
| 831 start2 -= start; | 831 start2 -= start; |
| 832 end2 -= start; | 832 end2 -= start; |
| 833 } | 833 } |
| 834 start += size; | 834 start += size; |
| 835 thr = pow(thr / (avg_energy * (end2 - start2)), 0.3 + 0.1*(lastband - g) / lastband); | 835 thr = pow(thr / (avg_energy * (end2 - start2)), 0.3 + 0.1*(lastband - g) / lastband); |
| 837 uplim[w*16+g] = distfact / (1.4 * thr + t*t*t + 0.075); | 837 uplim[w*16+g] = distfact / (1.4 * thr + t*t*t + 0.075); |
| 838 } | 838 } |
| 839 } | 839 } |
| 840 memset(sce->sf_idx, 0, sizeof(sce->sf_idx)); | 840 memset(sce->sf_idx, 0, sizeof(sce->sf_idx)); |
| 841 abs_pow34_v(s->scoefs, sce->coeffs, 1024); | 841 abs_pow34_v(s->scoefs, sce->coeffs, 1024); |
| 842 for(w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]){ | 842 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
| 843 start = w*128; | 843 start = w*128; |
| 844 for(g = 0; g < sce->ics.num_swb; g++){ | 844 for (g = 0; g < sce->ics.num_swb; g++) { |
| 845 const float *coefs = sce->coeffs + start; | 845 const float *coefs = sce->coeffs + start; |
| 846 const float *scaled = s->scoefs + start; | 846 const float *scaled = s->scoefs + start; |
| 847 const int size = sce->ics.swb_sizes[g]; | 847 const int size = sce->ics.swb_sizes[g]; |
| 848 int scf, prev_scf, step; | 848 int scf, prev_scf, step; |
| 849 int min_scf = 0, max_scf = 255; | 849 int min_scf = 0, max_scf = 255; |
| 850 float curdiff; | 850 float curdiff; |
| 851 if(maxq[w*16+g] < 21.544){ | 851 if (maxq[w*16+g] < 21.544) { |
| 852 sce->zeroes[w*16+g] = 1; | 852 sce->zeroes[w*16+g] = 1; |
| 853 start += size; | 853 start += size; |
| 854 continue; | 854 continue; |
| 855 } | 855 } |
| 856 sce->zeroes[w*16+g] = 0; | 856 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); | 857 scf = prev_scf = av_clip(SCALE_ONE_POS - SCALE_DIV_512 - log2(1/maxq[w*16+g])*16/3, 60, 218); |
| 858 step = 16; | 858 step = 16; |
| 859 for(;;){ | 859 for (;;) { |
| 860 float dist = 0.0f; | 860 float dist = 0.0f; |
| 861 int quant_max; | 861 int quant_max; |
| 862 | 862 |
| 863 for(w2 = 0; w2 < sce->ics.group_len[w]; w2++){ | 863 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { |
| 864 int b; | 864 int b; |
| 865 dist += quantize_band_cost(s, coefs + w2*128, | 865 dist += quantize_band_cost(s, coefs + w2*128, |
| 866 scaled + w2*128, | 866 scaled + w2*128, |
| 867 sce->ics.swb_sizes[g], | 867 sce->ics.swb_sizes[g], |
| 868 scf, | 868 scf, |
| 872 &b); | 872 &b); |
| 873 dist -= b; | 873 dist -= b; |
| 874 } | 874 } |
| 875 dist *= 1.0f/512.0f; | 875 dist *= 1.0f/512.0f; |
| 876 quant_max = quant(maxq[w*16+g], ff_aac_pow2sf_tab[200 - scf + SCALE_ONE_POS - SCALE_DIV_512]); | 876 quant_max = quant(maxq[w*16+g], ff_aac_pow2sf_tab[200 - scf + SCALE_ONE_POS - SCALE_DIV_512]); |
| 877 if(quant_max >= 8191){ // too much, return to the previous quantizer | 877 if (quant_max >= 8191) { // too much, return to the previous quantizer |
| 878 sce->sf_idx[w*16+g] = prev_scf; | 878 sce->sf_idx[w*16+g] = prev_scf; |
| 879 break; | 879 break; |
| 880 } | 880 } |
| 881 prev_scf = scf; | 881 prev_scf = scf; |
| 882 curdiff = fabsf(dist - uplim[w*16+g]); | 882 curdiff = fabsf(dist - uplim[w*16+g]); |
| 883 if(curdiff == 0.0f) | 883 if (curdiff == 0.0f) |
| 884 step = 0; | 884 step = 0; |
| 885 else | 885 else |
| 886 step = fabsf(log2(curdiff)); | 886 step = fabsf(log2(curdiff)); |
| 887 if(dist > uplim[w*16+g]) | 887 if (dist > uplim[w*16+g]) |
| 888 step = -step; | 888 step = -step; |
| 889 if(FFABS(step) <= 1 || (step > 0 && scf >= max_scf) || (step < 0 && scf <= min_scf)){ | 889 if (FFABS(step) <= 1 || (step > 0 && scf >= max_scf) || (step < 0 && scf <= min_scf)) { |
| 890 sce->sf_idx[w*16+g] = scf; | 890 sce->sf_idx[w*16+g] = scf; |
| 891 break; | 891 break; |
| 892 } | 892 } |
| 893 scf += step; | 893 scf += step; |
| 894 if(step > 0) | 894 if (step > 0) |
| 895 min_scf = scf; | 895 min_scf = scf; |
| 896 else | 896 else |
| 897 max_scf = scf; | 897 max_scf = scf; |
| 898 } | 898 } |
| 899 start += size; | 899 start += size; |
| 900 } | 900 } |
| 901 } | 901 } |
| 902 minq = sce->sf_idx[0] ? sce->sf_idx[0] : INT_MAX; | 902 minq = sce->sf_idx[0] ? sce->sf_idx[0] : INT_MAX; |
| 903 for(i = 1; i < 128; i++){ | 903 for (i = 1; i < 128; i++) { |
| 904 if(!sce->sf_idx[i]) | 904 if (!sce->sf_idx[i]) |
| 905 sce->sf_idx[i] = sce->sf_idx[i-1]; | 905 sce->sf_idx[i] = sce->sf_idx[i-1]; |
| 906 else | 906 else |
| 907 minq = FFMIN(minq, sce->sf_idx[i]); | 907 minq = FFMIN(minq, sce->sf_idx[i]); |
| 908 } | 908 } |
| 909 if(minq == INT_MAX) minq = 0; | 909 if (minq == INT_MAX) minq = 0; |
| 910 minq = FFMIN(minq, SCALE_MAX_POS); | 910 minq = FFMIN(minq, SCALE_MAX_POS); |
| 911 maxsf = FFMIN(minq + SCALE_MAX_DIFF, SCALE_MAX_POS); | 911 maxsf = FFMIN(minq + SCALE_MAX_DIFF, SCALE_MAX_POS); |
| 912 for(i = 126; i >= 0; i--){ | 912 for (i = 126; i >= 0; i--) { |
| 913 if(!sce->sf_idx[i]) | 913 if (!sce->sf_idx[i]) |
| 914 sce->sf_idx[i] = sce->sf_idx[i+1]; | 914 sce->sf_idx[i] = sce->sf_idx[i+1]; |
| 915 sce->sf_idx[i] = av_clip(sce->sf_idx[i], minq, maxsf); | 915 sce->sf_idx[i] = av_clip(sce->sf_idx[i], minq, maxsf); |
| 916 } | 916 } |
| 917 } | 917 } |
| 918 | 918 |
| 921 { | 921 { |
| 922 int start = 0, i, w, w2, g; | 922 int start = 0, i, w, w2, g; |
| 923 int minq = 255; | 923 int minq = 255; |
| 924 | 924 |
| 925 memset(sce->sf_idx, 0, sizeof(sce->sf_idx)); | 925 memset(sce->sf_idx, 0, sizeof(sce->sf_idx)); |
| 926 for(w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]){ | 926 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
| 927 start = w*128; | 927 start = w*128; |
| 928 for(g = 0; g < sce->ics.num_swb; g++){ | 928 for (g = 0; g < sce->ics.num_swb; g++) { |
| 929 for(w2 = 0; w2 < sce->ics.group_len[w]; w2++){ | 929 for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) { |
| 930 FFPsyBand *band = &s->psy.psy_bands[s->cur_channel*PSY_MAX_BANDS+(w+w2)*16+g]; | 930 FFPsyBand *band = &s->psy.psy_bands[s->cur_channel*PSY_MAX_BANDS+(w+w2)*16+g]; |
| 931 if(band->energy <= band->threshold){ | 931 if (band->energy <= band->threshold) { |
| 932 sce->sf_idx[(w+w2)*16+g] = 218; | 932 sce->sf_idx[(w+w2)*16+g] = 218; |
| 933 sce->zeroes[(w+w2)*16+g] = 1; | 933 sce->zeroes[(w+w2)*16+g] = 1; |
| 934 }else{ | 934 } else { |
| 935 sce->sf_idx[(w+w2)*16+g] = av_clip(SCALE_ONE_POS - SCALE_DIV_512 + log2(band->threshold), 80, 218); | 935 sce->sf_idx[(w+w2)*16+g] = av_clip(SCALE_ONE_POS - SCALE_DIV_512 + log2(band->threshold), 80, 218); |
| 936 sce->zeroes[(w+w2)*16+g] = 0; | 936 sce->zeroes[(w+w2)*16+g] = 0; |
| 937 } | 937 } |
| 938 minq = FFMIN(minq, sce->sf_idx[(w+w2)*16+g]); | 938 minq = FFMIN(minq, sce->sf_idx[(w+w2)*16+g]); |
| 939 } | 939 } |
| 940 } | 940 } |
| 941 } | 941 } |
| 942 for(i = 0; i < 128; i++){ | 942 for (i = 0; i < 128; i++) { |
| 943 sce->sf_idx[i] = 140;//av_clip(sce->sf_idx[i], minq, minq + SCALE_MAX_DIFF - 1); | 943 sce->sf_idx[i] = 140;//av_clip(sce->sf_idx[i], minq, minq + SCALE_MAX_DIFF - 1); |
| 944 } | 944 } |
| 945 //set the same quantizers inside window groups | 945 //set the same quantizers inside window groups |
| 946 for(w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) | 946 for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) |
| 947 for(g = 0; g < sce->ics.num_swb; g++) | 947 for (g = 0; g < sce->ics.num_swb; g++) |
| 948 for(w2 = 1; w2 < sce->ics.group_len[w]; w2++) | 948 for (w2 = 1; w2 < sce->ics.group_len[w]; w2++) |
| 949 sce->sf_idx[(w+w2)*16+g] = sce->sf_idx[w*16+g]; | 949 sce->sf_idx[(w+w2)*16+g] = sce->sf_idx[w*16+g]; |
| 950 } | 950 } |
| 951 | 951 |
| 952 static void search_for_ms(AACEncContext *s, ChannelElement *cpe, const float lambda) | 952 static void search_for_ms(AACEncContext *s, ChannelElement *cpe, const float lambda) |
| 953 { | 953 { |
| 954 int start = 0, i, w, w2, g; | 954 int start = 0, i, w, w2, g; |
| 955 float M[128], S[128]; | 955 float M[128], S[128]; |
| 956 float *L34 = s->scoefs, *R34 = s->scoefs + 128, *M34 = s->scoefs + 128*2, *S34 = s->scoefs + 128*3; | 956 float *L34 = s->scoefs, *R34 = s->scoefs + 128, *M34 = s->scoefs + 128*2, *S34 = s->scoefs + 128*3; |
| 957 SingleChannelElement *sce0 = &cpe->ch[0]; | 957 SingleChannelElement *sce0 = &cpe->ch[0]; |
| 958 SingleChannelElement *sce1 = &cpe->ch[1]; | 958 SingleChannelElement *sce1 = &cpe->ch[1]; |
| 959 if(!cpe->common_window) | 959 if (!cpe->common_window) |
| 960 return; | 960 return; |
| 961 for(w = 0; w < sce0->ics.num_windows; w += sce0->ics.group_len[w]){ | 961 for (w = 0; w < sce0->ics.num_windows; w += sce0->ics.group_len[w]) { |
| 962 for(g = 0; g < sce0->ics.num_swb; g++){ | 962 for (g = 0; g < sce0->ics.num_swb; g++) { |
| 963 if(!cpe->ch[0].zeroes[w*16+g] && !cpe->ch[1].zeroes[w*16+g]){ | 963 if (!cpe->ch[0].zeroes[w*16+g] && !cpe->ch[1].zeroes[w*16+g]) { |
| 964 float dist1 = 0.0f, dist2 = 0.0f; | 964 float dist1 = 0.0f, dist2 = 0.0f; |
| 965 for(w2 = 0; w2 < sce0->ics.group_len[w]; w2++){ | 965 for (w2 = 0; w2 < sce0->ics.group_len[w]; w2++) { |
| 966 FFPsyBand *band0 = &s->psy.psy_bands[(s->cur_channel+0)*PSY_MAX_BANDS+(w+w2)*16+g]; | 966 FFPsyBand *band0 = &s->psy.psy_bands[(s->cur_channel+0)*PSY_MAX_BANDS+(w+w2)*16+g]; |
| 967 FFPsyBand *band1 = &s->psy.psy_bands[(s->cur_channel+1)*PSY_MAX_BANDS+(w+w2)*16+g]; | 967 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); | 968 float minthr = fminf(band0->threshold, band1->threshold); |
| 969 float maxthr = fmaxf(band0->threshold, band1->threshold); | 969 float maxthr = fmaxf(band0->threshold, band1->threshold); |
| 970 for(i = 0; i < sce0->ics.swb_sizes[g]; i++){ | 970 for (i = 0; i < sce0->ics.swb_sizes[g]; i++) { |
| 971 M[i] = (sce0->coeffs[start+w2*128+i] | 971 M[i] = (sce0->coeffs[start+w2*128+i] |
| 972 + sce1->coeffs[start+w2*128+i])*0.5; | 972 + sce1->coeffs[start+w2*128+i])*0.5; |
| 973 S[i] = sce0->coeffs[start+w2*128+i] | 973 S[i] = sce0->coeffs[start+w2*128+i] |
| 974 - sce1->coeffs[start+w2*128+i]; | 974 - sce1->coeffs[start+w2*128+i]; |
| 975 } | 975 } |
