While I’m trying to write a decent demuxer for the format, here’s the description of the first codec for it (I’ll postpone the rest until I implement a demuxer and a decoder for this one).
So, Moving Lines (aka codec 1) works on the usual 15-bit pixels and packs data into 16-bit words (sadly Ghidra
fails to realise that LDR
loads 16-bit data on ARMv4 but I’ll manage). Bits are read LSB first.
Here are patterns for the opcodes: first (low) bit signals a special code and when unset the rest of the word is a raw pixel. For special codes it’s easier to look at the top bits first though.
0x0001..0x8FFF
—copy the amount of pixels stored in the next 6 bits using displacement table (from -8,-8 to 8,8 excluding 0,0) with table index stored in the following 9 bits;0x9001..0xE5FF
—copy data from the already decoded part of current frame, next 6 bits are amount of pixels to copy, the following 8 bits code the displacement (from -9,-9 to 9,0);0xE601
—end of frame marker0xE603..0xEFFF
—run series, 10 bits code run length minus one and the next codeword is pixel value;0xF001..0xF7FF
—skip series, 10 bits code skip length minus one;0xF801..0xFFFF
—raw data values, 10 bits code code number of values, the following codewords contain packed 15-bit values. In the end bitstream is aligned to 16-bit boundary.
Since video data is usually clumped together in large chunks you need to keep decoding it until you encounter end-of frame marker (and then data for the following frame starts).
That’s all for now, hopefully more will come soon.
Update: apparently XAnim
(the greatest open-source multimedia player; sadly its subdomain seems to have expired) supported it as well (but no other video formats, not even raw ones).