Apple Intermediate Codec: Difference between revisions

From MultimediaWiki
Jump to navigation Jump to search
(→‎Band coding: Updated a bit)
Line 70: Line 70:


[[Category:Video Codecs]]
[[Category:Video Codecs]]
[[Category:Undiscovered Video Codecs]]
[[Category:Formats missing in MPlayer]]

Revision as of 06:07, 17 May 2013

Lossy codec used in Final Cut Express HD and iLife ’05

Apple Lists its Features as:

  • Intra Only
  • 4:2:0 color
  • 8-bits per sample

More technical details

Each frame starts with 24-byte header:

 6- 7  frame width
 8- 9  frame height
10-11  frame width (or maybe tile width)
12-13  frame height(or maybe tile height)
16     high nibble is ?, low nibble is ?
18     high nibble is ?, low nibble is ?
19     high 2 bits are ?, next 2 bits are ?, low 3 bits are ?

It is followed by some tables consisting of 16-bit little-endian entries (Huffman weights?).

There are 4 versions of coded data which differ by coded colourspaces (the same YUV420 but 8/16 bits per component and linear/non-linear?).

Each tile has data coded as 4 bands (probably in YYUV order) and DCT is employed. Bits are coded MSB in big-endian words.

Band coding

Each band is an array of 16-bit entries.

Used codes:

  • unary code - 00...01
  • Rice code - unary prefix and N bits of residue.
  • code2 - signed codes with unary prefix: k = get_unary(); value = get_bits(k*2) - (1 << N);

First 5 bits re used to select coding method:

 A = 1 bit
 B = 1 bit (looks like when it's zero, Rice code is used for reading pixel, when it's set - code2 is used)
 C = 3 bits (number of bits in code residue)

if A = 0, B = 0 then it's simple Rice codes with parameter C if A = 0, B = 1 then it's simple code2 with parameter C otherwise, read two additional variables

 D = 1 bit (if zero, use simple skip/pixel scheme, if set - use something more complicated)
 E = 3 bits (number of bits in skip residue)

if A = 1, B = 0, D = 0 then zero all line before decoding and then apply this simple scheme:

 x = 0;
 do{
   t = get_rice(E);
   x += t;
   if (x < width)
     pixels[x++] = get_rice(C);
 }while(x < width);

if A = 1, B = 1, D = 0 then scheme is almost the same, but with pixels[x] = get_code2(C);

TODO