[FFmpeg-devel] [PATCH 02/10] checkasm: Add vc1dsp inverse transform tests

Martin Storsjö martin at martin.st
Tue Mar 29 15:41:18 EEST 2022


On Fri, 25 Mar 2022, Ben Avison wrote:

> This test deliberately doesn't exercise the full range of inputs described in
> the committee draft VC-1 standard. It says:
>
> input coefficients in frequency domain, D, satisfy   -2048 <= D < 2047
> intermediate coefficients, E, satisfy                -4096 <= E < 4095
> fully inverse-transformed coefficients, R, satisfy    -512 <= R <  511
>
> For one thing, the inequalities look odd. Did they mean them to go the
> other way round? That would make more sense because the equations generally
> both add and subtract coefficients multiplied by constants, including powers
> of 2. Requiring the most-negative values to be valid extends the number of
> bits to represent the intermediate values just for the sake of that one case!
>
> For another thing, the extreme values don't look to occur in real streams -
> both in my experience and supported by the following comment in the AArch32
> decoder:
>
>    tNhalf is half of the value of tN (as described in vc1_inv_trans_8x8_c).
>    This is done because sometimes files have input that causes tN + tM to
>    overflow. To avoid this overflow, we compute tNhalf, then compute
>    tNhalf + tM (which doesn't overflow), and then we use vhadd to compute
>    (tNhalf + (tNhalf + tM)) >> 1 which does not overflow because it is
>    one instruction.
>
> My AArch64 decoder goes further than this. It calculates tNhalf and tM
> then does an SRA (essentially a fused halve and add) to compute
> (tN + tM) >> 1 without ever having to hold (tNhalf + tM) in a 16-bit element
> without overflowing. It only encounters difficulties if either tNhalf or
> tM overflow in isolation.
>
> I haven't had sight of the final standard, so it's possible that these
> issues were dealt with during finalisation, which could explain the lack
> of usage of extreme inputs in real streams. Or a preponderance of decoders
> that only support 16-bit intermediate values in their inverse transforms
> might have caused encoders to steer clear of such cases.
>
> I have effectively followed this approach in the test, and limited the
> scale of the coefficients sufficient that both the existing AArch32 decoder
> and my new AArch64 decoder both pass.
>
> Signed-off-by: Ben Avison <bavison at riscosopen.org>
> ---
> tests/checkasm/vc1dsp.c | 258 ++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 258 insertions(+)

The reasoning sounds sensible to me.

I didn't try to follow the exact logic for how the input data is produced, 
but it seems reasonable.

It'd be nice to unmacro the function and wrap it in a separate standalone 
test function like check_idct() in vp8dsp, check_itxfm in vp9dsp or 
check_idct in hevc_idct.c. You may want to have a deeply nested loop to 
check e.g.

     for (int w = 4; w <= 8; w += 4) {
         for (int h = 4; w <= 8; w += 4) {
             for (int dc = 0; dc <= 1; dc++) {
                 if (w == 8 && h == 8 && dc == 0)
                     continue; // Tested separately
                 [... actual test ...]
                 (or call a separate check_idct_func(w,h,dc) function
                 to avoid unnecessarily deep indentation of a lot of code)
             }
         }
     }

// Martin



More information about the ffmpeg-devel mailing list