Apple Intermediate Codec: Difference between revisions

From MultimediaWiki
Jump to navigation Jump to search
 
(One intermediate revision by the same user not shown)
Line 12: Line 12:
* 8-bits per sample
* 8-bits per sample


== More technical details ==
== Frame format ==


Each frame starts with 24-byte header:
Each frame starts with 24-byte header:


  0    version (should be 1)
  1    frame header size (should be 22)
  2- 5  full frame size
   6- 7  frame width
   6- 7  frame width
   8- 9  frame height
   8- 9  frame height
  10-11  frame width (or maybe tile width)
  10-11  frame width (for displaying?)
  12-13  frame height(or maybe tile height)
  12-13  frame height(for displaying?)
14    two nibbles, purpose unknown
15    quantiser
16    high nibble is 0 for progressive frame, 3 for interlaced, low nibble is unknown (should be 9 or 14)
17    unknown variables packed in 2:3:3 bits
18    unknown
19    gamma: 4 -> 2.2, 5 -> 2.8, 8 -> 1.0, other values default to 2.(2)
20    unknown
21-23  padding?


16     high nibble is ?, low nibble is ?
It is followed by some tables consisting of 16-bit little-endian tile sizes (in 32-bit words). The table is aligned to 4 bytes.
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?).
Tile height is 1 macroblock, tile width is selected so that frame width is divided into <= 32 tiles of the same width (or 16 tiles in case it's not possible).


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?).
=== Tile coding ===


Each tile has data coded as 4 bands (probably in YYUV order) and DCT is employed.
Tile consists of 4 bands: blocks with 64 luma coefficients, blocks with 32 chroma coefficients, blocks with 192 luma extension coefficients and blocks with 96 chroma extension coefficients. This is done for scalable decoding.
Bits are coded MSB in big-endian words.


==== Band coding ====
Each band is an array of 16-bit entries.
 
  A - no skips / skips present (1 bit)
  B - use Rice / ext-exp-Golomb for coeff (3 bits)
  C - code parameter (1 bit)
  if (A == 1) {
  D - use Rice / ext-exp-Golomb for skip (1 bit)
  E - skip parameter (3 bits)
  }
 
  if (!A) {
      for (i = 0; i < num_mbs; i++) {
          for (idx = 0; idx < num_coeffs; idx++)
              dst[scan[idx]] = B ? get_eg(C) : get_rice(C);
  } else {
      for (i = 0; i < num_mbs; i++) {
          idx = 0;
          while (idx < num_coeffs) { //32-196
              idx += (D ? get_eg(E) : get_rice(E)) + 1;
              if (idx == num_coeffs - 1)
                  break;
              dst[scan[idx]] = (B ? get_eg(C) : get_rice(C)) + 1;
          }
      }
  }
 
  int get_eg(int k)
  {
    val = get_unary();
    return (1 << val + k) - (1 << k) + get_bits(val + k);
  }


Each band is an array of 16-bit entries.
Unquantisation is performed as
 
  val = src[i] >> 1;
  if (src[i] & 1)
      val = -val;
  val = (val * quant_matrix[i] * quant >> 4) + (src[i] & 1)
 
== Tables ==
 
=== Quantisation matrix ===


Used codes:
  8, 16, 19, 22, 22, 26, 26, 27
* unary code - <code>00...01</code>
  16, 16, 22, 22, 26, 27, 27, 29
* Rice code - unary prefix and <code>N</code> bits of residue.
19, 22, 26, 26, 27, 29, 29, 35
* code2 - signed codes with unary prefix: <code>k = get_unary(); value = get_bits(k*2) - (1 << N); </code>
22, 24, 27, 27, 29, 32, 34, 38
26, 27, 29, 29, 32, 35, 38, 46
27, 29, 34, 34, 35, 40, 46, 56
29, 34, 34, 37, 40, 48, 56, 69
34, 37, 38, 40, 48, 58, 69, 83


First 5 bits re used to select coding method:
=== Luma scan ===


   A = 1 bit
   0,  4,  1,  2,  5,  8, 12,  9
   B = 1 bit (looks like when it's zero, Rice code is used for reading pixel, when it's set - code2 is used)
   6,  3,  7, 10, 13, 14, 11, 15
  C = 3 bits (number of bits in code residue)
47, 43, 46, 45, 42, 39, 35, 38
41, 44, 40, 37, 34, 33, 36, 32
16, 20, 17, 18, 21, 24, 28, 25
22, 19, 23, 26, 29, 30, 27, 31
63, 59, 62, 61, 58, 55, 51, 54
57, 60, 56, 53, 50, 49, 52, 48


if <code>A = 0, B = 0</code> then it's simple Rice codes with parameter <code>C</code>
=== Luma extension scan ===
if <code>A = 0, B = 1</code> then it's simple code2 with parameter <code>C</code>
otherwise, read two additional variables


  D = 1 bit (if zero, use simple skip/pixel scheme, if set - use something more complicated)
64, 72, 65, 66, 73, 80, 88, 81
  E = 3 bits (number of bits in skip residue)
74, 67, 75, 82, 89, 90, 83, 91
0, 4, 1, 2, 5, 8, 12, 9
6, 3, 7, 10, 13, 14, 11, 15
16, 20, 17, 18, 21, 24, 28, 25
22, 19, 23, 26, 29, 30, 27, 31
155, 147, 154, 153, 146, 139, 131, 138
145, 152, 144, 137, 130, 129, 136, 128
47, 43, 46, 45, 42, 39, 35, 38
41, 44, 40, 37, 34, 33, 36, 32
63, 59, 62, 61, 58, 55, 51, 54
57, 60, 56, 53, 50, 49, 52, 48
96, 104, 97, 98, 105, 112, 120, 113
106, 99, 107, 114, 121, 122, 115, 123
68, 76, 69, 70, 77, 84, 92, 85
78, 71, 79, 86, 93, 94, 87, 95
100, 108, 101, 102, 109, 116, 124, 117
110, 103, 111, 118, 125, 126, 119, 127
187, 179, 186, 185, 178, 171, 163, 170
177, 184, 176, 169, 162, 161, 168, 160
159, 151, 158, 157, 150, 143, 135, 142
149, 156, 148, 141, 134, 133, 140, 132
191, 183, 190, 189, 182, 175, 167, 174
181, 188, 180, 173, 166, 165, 172, 164


if <code>A = 1, B = 0, D = 0</code> then zero all line before decoding and then apply this simple scheme:
=== Chroma scan ===


   x = 0;
   0,  4,  1,  2,  5,  8, 12,  9
   do{
   6,  3,  7, 10, 13, 14, 11, 15
    t = get_rice(E);
31, 27, 30, 29, 26, 23, 19, 22
    x += t;
25, 28, 24, 21, 18, 17, 20, 16
    if (x < width)
32, 36, 33, 34, 37, 40, 44, 41
      pixels[x++] = get_rice(C);
38, 35, 39, 42, 45, 46, 43, 47
  }while(x < width);
63, 59, 62, 61, 58, 55, 51, 54
57, 60, 56, 53, 50, 49, 52, 48


if <code>A = 1, B = 1, D = 0</code> then scheme is almost the same, but with <code>pixels[x] = get_code2(C);</code>
=== Chroma extension scan ===


'''TODO'''
16, 24, 17, 18, 25, 32, 40, 33
26, 19, 27, 34, 41, 42, 35, 43
0, 4, 1, 2, 5, 8, 12, 9
6, 3, 7, 10, 13, 14, 11, 15
20, 28, 21, 22, 29, 36, 44, 37
30, 23, 31, 38, 45, 46, 39, 47
95, 87, 94, 93, 86, 79, 71, 78
85, 92, 84, 77, 70, 69, 76, 68
63, 59, 62, 61, 58, 55, 51, 54
57, 60, 56, 53, 50, 49, 52, 48
91, 83, 90, 89, 82, 75, 67, 74
81, 88, 80, 73, 66, 65, 72, 64
112, 120, 113, 114, 121, 128, 136, 129
122, 115, 123, 130, 137, 138, 131, 139
96, 100, 97, 98, 101, 104, 108, 105
102, 99, 103, 106, 109, 110, 107, 111
116, 124, 117, 118, 125, 132, 140, 133
126, 119, 127, 134, 141, 142, 135, 143
191, 183, 190, 189, 182, 175, 167, 174
181, 188, 180, 173, 166, 165, 172, 164
159, 155, 158, 157, 154, 151, 147, 150
153, 156, 152, 149, 146, 145, 148, 144
187, 179, 186, 185, 178, 171, 163, 170
177, 184, 176, 169, 162, 161, 168, 160




[[Category:Video Codecs]]
[[Category:Video Codecs]]
[[Category:Intermediate Video Codecs]]

Latest revision as of 22:25, 23 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

Frame format

Each frame starts with 24-byte header:

 0     version (should be 1)
 1     frame header size (should be 22)
 2- 5  full frame size
 6- 7  frame width
 8- 9  frame height
10-11  frame width (for displaying?)
12-13  frame height(for displaying?)
14     two nibbles, purpose unknown
15     quantiser
16     high nibble is 0 for progressive frame, 3 for interlaced, low nibble is unknown (should be 9 or 14)
17     unknown variables packed in 2:3:3 bits
18     unknown
19     gamma: 4 -> 2.2, 5 -> 2.8, 8 -> 1.0, other values default to 2.(2)
20     unknown
21-23  padding?

It is followed by some tables consisting of 16-bit little-endian tile sizes (in 32-bit words). The table is aligned to 4 bytes.

Tile height is 1 macroblock, tile width is selected so that frame width is divided into <= 32 tiles of the same width (or 16 tiles in case it's not possible).

Tile coding

Tile consists of 4 bands: blocks with 64 luma coefficients, blocks with 32 chroma coefficients, blocks with 192 luma extension coefficients and blocks with 96 chroma extension coefficients. This is done for scalable decoding.

Each band is an array of 16-bit entries.

 A - no skips / skips present (1 bit)
 B - use Rice / ext-exp-Golomb for coeff (3 bits)
 C - code parameter (1 bit)
 if (A == 1) {
 D - use Rice / ext-exp-Golomb for skip (1 bit)
 E - skip parameter (3 bits)
 }
 
 if (!A) {
     for (i = 0; i < num_mbs; i++) {
         for (idx = 0; idx < num_coeffs; idx++)
             dst[scan[idx]] = B ? get_eg(C) : get_rice(C);
 } else {
     for (i = 0; i < num_mbs; i++) {
         idx = 0;
         while (idx < num_coeffs) { //32-196
             idx += (D ? get_eg(E) : get_rice(E)) + 1;
             if (idx == num_coeffs - 1)
                 break;
             dst[scan[idx]] = (B ? get_eg(C) : get_rice(C)) + 1;
         }
     }
 }
 int get_eg(int k)
 {
    val = get_unary();
    return (1 << val + k) - (1 << k) + get_bits(val + k);
 }

Unquantisation is performed as

 val = src[i] >> 1;
 if (src[i] & 1)
     val = -val;
 val = (val * quant_matrix[i] * quant >> 4) + (src[i] & 1)

Tables

Quantisation matrix

 8, 16, 19, 22, 22, 26, 26, 27
16, 16, 22, 22, 26, 27, 27, 29
19, 22, 26, 26, 27, 29, 29, 35
22, 24, 27, 27, 29, 32, 34, 38
26, 27, 29, 29, 32, 35, 38, 46
27, 29, 34, 34, 35, 40, 46, 56
29, 34, 34, 37, 40, 48, 56, 69
34, 37, 38, 40, 48, 58, 69, 83

Luma scan

 0,  4,  1,  2,  5,  8, 12,  9
 6,  3,  7, 10, 13, 14, 11, 15
47, 43, 46, 45, 42, 39, 35, 38
41, 44, 40, 37, 34, 33, 36, 32
16, 20, 17, 18, 21, 24, 28, 25
22, 19, 23, 26, 29, 30, 27, 31
63, 59, 62, 61, 58, 55, 51, 54
57, 60, 56, 53, 50, 49, 52, 48

Luma extension scan

64, 72, 65, 66, 73, 80, 88, 81
74, 67, 75, 82, 89, 90, 83, 91
0, 4, 1, 2, 5, 8, 12, 9
6, 3, 7, 10, 13, 14, 11, 15
16, 20, 17, 18, 21, 24, 28, 25
22, 19, 23, 26, 29, 30, 27, 31
155, 147, 154, 153, 146, 139, 131, 138
145, 152, 144, 137, 130, 129, 136, 128
47, 43, 46, 45, 42, 39, 35, 38
41, 44, 40, 37, 34, 33, 36, 32
63, 59, 62, 61, 58, 55, 51, 54
57, 60, 56, 53, 50, 49, 52, 48
96, 104, 97, 98, 105, 112, 120, 113
106, 99, 107, 114, 121, 122, 115, 123
68, 76, 69, 70, 77, 84, 92, 85
78, 71, 79, 86, 93, 94, 87, 95
100, 108, 101, 102, 109, 116, 124, 117
110, 103, 111, 118, 125, 126, 119, 127
187, 179, 186, 185, 178, 171, 163, 170
177, 184, 176, 169, 162, 161, 168, 160
159, 151, 158, 157, 150, 143, 135, 142
149, 156, 148, 141, 134, 133, 140, 132
191, 183, 190, 189, 182, 175, 167, 174
181, 188, 180, 173, 166, 165, 172, 164

Chroma scan

 0,  4,  1,  2,  5,  8, 12,  9
 6,  3,  7, 10, 13, 14, 11, 15
31, 27, 30, 29, 26, 23, 19, 22
25, 28, 24, 21, 18, 17, 20, 16
32, 36, 33, 34, 37, 40, 44, 41
38, 35, 39, 42, 45, 46, 43, 47
63, 59, 62, 61, 58, 55, 51, 54
57, 60, 56, 53, 50, 49, 52, 48

Chroma extension scan

16, 24, 17, 18, 25, 32, 40, 33
26, 19, 27, 34, 41, 42, 35, 43
0, 4, 1, 2, 5, 8, 12, 9
6, 3, 7, 10, 13, 14, 11, 15
20, 28, 21, 22, 29, 36, 44, 37
30, 23, 31, 38, 45, 46, 39, 47
95, 87, 94, 93, 86, 79, 71, 78
85, 92, 84, 77, 70, 69, 76, 68
63, 59, 62, 61, 58, 55, 51, 54
57, 60, 56, 53, 50, 49, 52, 48
91, 83, 90, 89, 82, 75, 67, 74
81, 88, 80, 73, 66, 65, 72, 64
112, 120, 113, 114, 121, 128, 136, 129
122, 115, 123, 130, 137, 138, 131, 139
96, 100, 97, 98, 101, 104, 108, 105
102, 99, 103, 106, 109, 110, 107, 111
116, 124, 117, 118, 125, 132, 140, 133
126, 119, 127, 134, 141, 142, 135, 143
191, 183, 190, 189, 182, 175, 167, 174
181, 188, 180, 173, 166, 165, 172, 164
159, 155, 158, 157, 154, 151, 147, 150
153, 156, 152, 149, 146, 145, 148, 144
187, 179, 186, 185, 178, 171, 163, 170
177, 184, 176, 169, 162, 161, 168, 160