2x speedup of surround decoding on Cortex-A9.
Unified · Split
| @@ -1409,17 +1409,24 @@ static av_always_inline int vorbis_residue_decode_internal(vorbis_context *vc, · 1408 unmodified lines | |||
| 1409 | } | 1409 | } |
| 1410 | 1410 | ||
| 1411 | } else if (vr_type == 2) { | 1411 | } else if (vr_type == 2) { |
| 1412 | voffs = voffset; | 1412 | unsigned voffs_div = FASTDIV(voffset, ch); |
| 1413 | unsigned voffs_mod = voffset - voffs_div * ch; | ||
| 1413 | 1414 | ||
| 1414 | for (k = 0; k < step; ++k) { | 1415 | for (k = 0; k < step; ++k) { |
| 1415 | coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * dim; | 1416 | coffs = get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * dim; |
| 1416 | for (l = 0; l < dim; ++l, ++voffs) { | 1417 | for (l = 0; l < dim; ++l) { |
| 1417 | vec[voffs / ch + (voffs % ch) * vlen] += codebook.codevectors[coffs + l]; // FPMATH FIXME use if and counter instead of / and % | 1418 | vec[voffs_div + voffs_mod * vlen] += |
| 1419 | codebook.codevectors[coffs + l]; | ||
| 1418 | 1420 | ||
| 1419 | av_dlog(NULL, " pass %d offs: %d curr: %f change: %f cv offs.: %d+%d \n", | 1421 | av_dlog(NULL, " pass %d offs: %d curr: %f change: %f cv offs.: %d+%d \n", |
| 1420 | pass, voffset / ch + (voffs % ch) * vlen, | 1422 | pass, voffs_div + voffs_mod * vlen, |
| 1421 | vec[voffset / ch + (voffs % ch) * vlen], | 1423 | vec[voffs_div + voffs_mod * vlen], |
| 1422 | codebook.codevectors[coffs + l], coffs, l); | 1424 | codebook.codevectors[coffs + l], coffs, l); |
| 1425 | |||
| 1426 | if (++voffs_mod == ch) { | ||
| 1427 | voffs_div++; | ||
| 1428 | voffs_mod = 0; | ||
| 1429 | } | ||
| 1423 | } | 1430 | } |
| 1424 | } | 1431 | } |
| 1425 | } | 1432 | } |