opusdsp: adjust and optimize C function to match assembly

Multimedia / FFmpeg - Lynne [lynne.ee] - 11 September 2019 02:28 EDT

The C and asm versions behaved differently _outside_ of the codec.

The C version returned pre-multiplied 'state' for the next execution to use right away, while the assembly version outputted non-multiplied 'state' for the next execution to multiply to save instructions. Since the initial state when initialized or seeking is always 0, and since C and asm versions were never mixed, there was no issue.

However, comparing outputs directly in checkasm doesn't work without dividing the initial state by CELT_EMPH_COEFF and multiplying the returned state by CELT_EMPH_COEFF for the assembly function.

Since its actually faster to do this in C as well, copy the behavior the asm versions use. As a reminder, the initial state 0 is divided by CELT_EMPH_COEFF on seek and init (just in case in the future this is changed, its technically more correct to init with CELT_EMPH_COEFF than 0, however when seeking this will result in more audiable pops, unlike with 0 where the output gets in sync over a few samples).

6b22e28f4c opusdsp: adjust and optimize C function to match assembly
libavcodec/opus_celt.c | 6 +++++-
libavcodec/opusdsp.c | 11 +++--------
2 files changed, 8 insertions(+), 9 deletions(-)

  • Share