• Lynne's avatar
    opusdsp: adjust and optimize C function to match assembly · 6b22e28f
    Lynne authored
    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).
    6b22e28f
opus_celt.c 18.4 KB