Tommy Thorn - 2010-02-22

First a big thanks for the fantastic video codec and the excellent

I can see that work on Schrodinger is active, but what is status of
the specification and the research decoder? The git repository has
very little activity and doesn't contrain the latex sources for the

For the past few weeks I've been attempting writing yet another Dirac
decoder by essentially transcriping the specification as closely as
possible. The purpose is exclusively to have a simpler reference
decoder than the dirac-research and Schroedinger implementation. I'll
make it available in case it could help others who need a quick
clarification of the specification. (This afternoon I completed enough
for perfect decoding of Intra frames, but motion compensation is work
in progress).

In the process of doing this I have found a couple of bad typos in the
spec and a lot of minor issues/typos. I'll be happy to share the list
or even update the latex source if that would be helpful. Is the CVS
repository version the most recent one?

I'll spare you the full list, but here are a few of the worst (the led
to hard-to-find bugs):


    Setting state to {} wipes out data used by the data decoder
    defined in Appendix A, notably NEXT_BIT and CURRENT_BYTE.


    The "read_byte()" in parse_info() should be "read_uint_lit(1)".


    The parenthesises are wrong, the +1 goes outside

    state[LUMA_DEPTH] = intlog2(video params[LUMA_EXCURSION]) + 1
    state[CHROMA_DEPTH] = intlog2(video params[CHROMA_EXCURSION]) + 1


    follow_context() return the probability, but should just return
    the label:


return ctx_label


    read_uinta() passes the probability to read_boola() but should
    just pass the label:


if (read_boola(context_prob_set[DATA]) == True):


    read_sinta() passes the probability to read_boola() but should
    just pass the label:


if (read_boola(context_prob_set[SIGN]) == True):


    read_boola(): context_index should be context_label


    renormalise() is missing a pair of parenthesises, should be

   if (((state[LOW] + state[RANGE] - 1) ^ state[LOW]) >= 0x8000):