[theora-dev] Bug in reference idct.

Chris Brien chrisb at codian.com
Wed Mar 5 13:43:53 PST 2008


Hi

The Theora specification states, in section 7.9.3 ("The 1D Inverse DCT")
steps 14-16:

14. Assign T[5] the value T[4] - T[5].
15. Truncate T[5] to a 16-bit representation by dropping any higher-order
bits.
16. Assign T[5] the value C4 * (-T[5]) >> 16.

However, the relevant section of code in the reference decoder
(lib/dec/idct.c line 50) is:

t[5]=OC_C4S4*(ogg_int16_t)(t[4]-t[5])>>16;

i.e. T[5] (the result of T[4]-T[5]) is not inverted before being
multiplied by C4.

Lines 106, 150 and 190 in idct.c do the same thing - the spec says the
result of (T[4] - T[5]) should be negated before being multiplied. I
believe this is a bug in the reference implementation.

The experimental "from-scratch" theora-exp has this same bug.


Further, the spec states in the same section, on step 50:

50. Assign X the value T[1] - T[6].

This is impossible as X is defined to be an array. I believe the intent
was to assign R the value of (T[1] - T[6]). The reference decoder states:
   _y[6<<3]=(ogg_int16_t)(t[1]-t[6]);

which would achieve the same result as assigning to R. I believe this is a
bug in the spec.



Chris Brien


More information about the theora-dev mailing list