On2 Audio for Video Codec
- Codec ID: 0x0500, 0x0501
- Company: On2
On2's Audio for Video codec (AVC) is a perceptual audio codec by On2, packaged in AVI files along with their video codecs.
The codec seems to be MDCT-based with frame of 1024 samples.
Version 0x0500
coded only monaural sound with one chunk per audio frame, 0x0501
can be stereo and contain several chunks in a single frame (every chunk has 16-bit little-endian coded size before it).
Chunk format
enhanced mode flag (should be always zero) coding mode (3 bits) if (coding mode == 3) // short windows window grouping flags (7 bits) M/S present flag if (M/S present) M/S flags for each independent band codebook description scales coefficients
Window mode
- 0 - ordinary long window
- 1 - long window with fading in delay
- 2 - long window with special windowing and delay handling
- 3 - eight short windows
- 4-7 - long window with special windowing and delay handling
Codebook description
base = 0; nsect = 0; bps = long window ? 5 : 3; esc = (1 << bps) - 1; while (base < bands) { section[nsect].cb = get_bits(4); val = get_bits(bps); while (val == esc) { base += val; val = get_bits(bps); } base += val; section[nsect].end = base; nsect++; }
Scale description
Scales are read for all independent bands with non-zero coding. First scale is explicitly coded as 7-bit value, the following scales are coded as a difference to the previous scale with static Huffman code.
Coefficients
Coefficients are coded with 14 different static Huffman codesets. Codeset 0 is not coded, codesets 1-8 encode quadruplets of coefficients, codesets 9-15 code pairs of coefficients. Additionally, for codeset 15 values -16 and 16 are escape values. In case those escape values happen, real values are read as exp-Golomb plus three additional bits and the sign should be the same as the sign of escape value.
Unscaling is performed as coeffs[i] = val * sqrt(val) * scale_tab[scale]
Tables
Long window band ends
4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 88, 96, 108, 120, 132, 144, 156, 172, 188, 204, 224, 244, 264, 288, 312, 340, 368, 400, 432, 464, 496, 528, 560, 592, 624, 656, 688, 720, 752, 784, 816, 848, 880, 1024
Short window band ends
4, 8, 12, 16, 20, 24, 32, 40, 48, 56, 68, 80, 108, 128
Scale table
For 0-19:
scale_tab[i] = ceil(exp(ln(10) / 10 * i) * 16) / 32
For 20-127:
scale_tab[i] = ceil(exp(ln(10) / 10 * i) * 0.5)
Huffman tables
TODO
Scale differences table
Codes (-60..59):
0x6FFFF, 0xBFFF2, 0xBFFF3, 0xBFFF4, 0xBFFF5, 0xBFFF6, 0xBFFF7, 0xBFFF8, 0xBFFF9, 0xBFFFA, 0xBFFFB, 0xBFFFC, 0xBFFFD, 0xBFFFE, 0xBFFFF, 0xDF9A0, 0xDF9A1, 0xDF9A2, 0xDF9A3, 0xDF9A4, 0xDF9A5, 0xDF9A6, 0xDF9A7, 0xDF9A8, 0xDF9A9, 0x37FFE, 0x6FCDE, 0x6FFFA, 0x0BFF7, 0x0B7FF, 0x0DF9F, 0x05FF8, 0x0B7FE, 0x05FF9, 0x06FCE, 0x05BFE, 0x037FE, 0x02DFE, 0x00DFA, 0x00DFE, 0x017FC, 0x00DBE, 0x00B7E, 0x005FE, 0x0037D, 0x002DE, 0x0017E, 0x0016C, 0x000DE, 0x000BE, 0x0006C, 0x0005A, 0x0003E, 0x00034, 0x0002C, 0x0001F, 0x0000E, 0x0000E, 0x00006, 0x00002, 0x00000, 0x00004, 0x0000A, 0x0000C, 0x0001E, 0x0001E, 0x0002E, 0x00035, 0x0003F, 0x0005E, 0x0006E, 0x000DA, 0x0016D, 0x0016E, 0x001B6, 0x002FE, 0x0036E, 0x0037C, 0x005BE, 0x006DE, 0x006FE, 0x00DBF, 0x00DFB, 0x016FE, 0x017FD, 0x01BFE, 0x01BF2, 0x02FFE, 0x06FCC, 0x05FFE, 0x05FFA, 0x06FFE, 0x0BFF6, 0x0BFFE, 0x0DF9E, 0x00DF8, 0x0DFFE, 0x37FFC, 0x6FFFB, 0x5FFF8, 0xDF9AA, 0xDF9AB, 0xDF9AC, 0xDF9AD, 0xDF9AE, 0xDF9AF, 0xDF9B0, 0xDF9B1, 0xDF9B2, 0xDF9B3, 0x6FFFE, 0xDF9B4, 0xDF9B5, 0xDF9B6, 0xDF9B7, 0xDF9B8, 0xDF9B9, 0xDF9BA, 0xDF9BB, 0xDF9BE,
Lengths:
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 19, 20, 20, 16, 16, 17, 15, 16, 15, 16, 15, 15, 14, 13, 13, 13, 13, 12, 11, 11, 10, 9, 9, 9, 8, 8, 7, 7, 7, 6, 5, 5, 4, 3, 3, 2, 3, 4, 5, 5, 6, 6, 7, 7, 7, 8, 9, 9, 9, 10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 13, 14, 14, 14, 16, 15, 15, 16, 16, 16, 17, 13, 17, 19, 20, 19, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21,