Apple Lossless Audio Coding: Difference between revisions
(added fourcc and category) |
(link to recently open sourced codec) |
||
(14 intermediate revisions by 5 users not shown) | |||
Line 1: | Line 1: | ||
* FOURCCS: alac | * FOURCCS: alac | ||
* Company: [[Apple]] | * Company: [[Apple]] | ||
* Technical Description: | * Technical Description: http://craz.net/programs/itunes/alac.html | ||
* Samples: http://samples.mplayerhq.hu/A-codecs/lossless/ (luckynight.m4a) | |||
Lossless | Apple Lossless Audio Coding using linear prediction with [[Golomb|Golomb-Rice]] coding of the difference. Similar to FLAC, although the bitstreams are not compatible. Usually stored in an [[MP4]] container, as a private extension since it is not part of the MPEG-4 standard. | ||
On October 27, 2011, ALAC was open sourced under the Apache License 2.0. The source can be found at [http://alac.macosforge.org/ http://alac.macosforge.org/]. | |||
=== Extradata === | |||
{| border="1" | |||
! Syntax !! Number of bits !! Semantics | |||
|- | |||
|atom size || 32 || (0x24), big-endian | |||
|- | |||
|tag || 32 || 'alac' | |||
|- | |||
|??? || 32 || zero ? | |||
|- | |||
|max sample per frame || 32 || | |||
|- | |||
|??? || 8 || zero ? | |||
|- | |||
|sample size || 8 || | |||
|- | |||
|rice history mult || 8 || | |||
|- | |||
|rice initial history || 8 || | |||
|- | |||
|rice kmodifier || 8 || | |||
|- | |||
|channels || 8 || ? | |||
|- | |||
|??? || 16 || | |||
|- | |||
|max coded frame size || 32 || | |||
|- | |||
|bitrate || 32 || ? | |||
|- | |||
|samplerate || 32 || | |||
|} | |||
=== Frame Header === | |||
{| border="1" | |||
! Syntax !! Number of bits !! Semantics | |||
|- | |||
| channels || 3 || Number of channel -1 (Should be the same than in extradata ???) | |||
|- | |||
| ??? || 4 || ??? (seem to be always 0) | |||
|- | |||
| ??? || 12 || ??? (seem to be always 0) | |||
|- | |||
| hasoutputsamples || 1 || the number of samples is stored in the header | |||
|- | |||
| wasted_bytes || 2 || unknow (same as flac ???) | |||
|- | |||
| isverbatim || 1 || if 1, the data is not compressed | |||
|- | |||
| if (hasoutputsamples) { || || | |||
|- | |||
| outputsamples || 32 || number of samples (sometimes the value is wrong [1]) | |||
|- | |||
| } || || | |||
|} | |||
[1] http://www1.mplayerhq.hu/MPlayer/samples/A-codecs/lossless/luckynight.m4a need + 32 and http://www1.mplayerhq.hu/MPlayer/samples/A-codecs/lossless/ALAC/old_midi_stuff.m4a + 112 | |||
=== Verbatim frame === | |||
{| border="1" | |||
! Syntax !! Number of bits !! Semantics | |||
|- | |||
| data || sample_size * outputsamples * channels || Unencoded subblock | |||
|} | |||
=== Compressed frame === | |||
{| border="1" | |||
! Syntax !! Number of bits !! Semantics | |||
|- | |||
| interlacing_shift || 8 || should be 0 if no channel interlacing. | |||
|- | |||
| interlacing_leftweight || 8 || | |||
|- | |||
| for each channel { | |||
|- | |||
| prediction_type || 4 || should be 0 | |||
|- | |||
| prediction_quantitization || 4 || | |||
|- | |||
| ricemodifier || 3 || | |||
|- | |||
| predictor_coef_num || 5 || | |||
|- | |||
| predictor_coef_table || 16 * predictor_coef_num || | |||
|- | |||
| } | |||
|- | |||
| for each channel { | |||
|- | |||
| compressed data || || modfied Rice coding and Adaptive FIR filter | |||
|- | |||
| } | |||
|} | |||
Channel Interlacing | |||
It is a mid/side stereo with weight. | |||
channel 0 is the mid(average) channel, channel 1 is the side(difference) channel. | |||
:''right = mid - ((difference * interlacing_leftweight) >> interlacing_shift)'' | |||
:''left = right + difference'' | |||
It seems we have interlacing_leftweight == interlacing_shift in most of the samples | |||
=== Frame Footer === | |||
{| border="1" | |||
! Syntax !! Number of bits !! Semantics | |||
|- | |||
| EOF || 3 || should be always 7 | |||
|} | |||
[[Category:Lossless Audio Codecs]] | [[Category:Lossless Audio Codecs]] | ||
[[Category:Audio Codecs]] |
Latest revision as of 18:08, 27 October 2011
- FOURCCS: alac
- Company: Apple
- Technical Description: http://craz.net/programs/itunes/alac.html
- Samples: http://samples.mplayerhq.hu/A-codecs/lossless/ (luckynight.m4a)
Apple Lossless Audio Coding using linear prediction with Golomb-Rice coding of the difference. Similar to FLAC, although the bitstreams are not compatible. Usually stored in an MP4 container, as a private extension since it is not part of the MPEG-4 standard.
On October 27, 2011, ALAC was open sourced under the Apache License 2.0. The source can be found at http://alac.macosforge.org/.
Extradata
Syntax | Number of bits | Semantics |
---|---|---|
atom size | 32 | (0x24), big-endian |
tag | 32 | 'alac' |
??? | 32 | zero ? |
max sample per frame | 32 | |
??? | 8 | zero ? |
sample size | 8 | |
rice history mult | 8 | |
rice initial history | 8 | |
rice kmodifier | 8 | |
channels | 8 | ? |
??? | 16 | |
max coded frame size | 32 | |
bitrate | 32 | ? |
samplerate | 32 |
Frame Header
Syntax | Number of bits | Semantics |
---|---|---|
channels | 3 | Number of channel -1 (Should be the same than in extradata ???) |
??? | 4 | ??? (seem to be always 0) |
??? | 12 | ??? (seem to be always 0) |
hasoutputsamples | 1 | the number of samples is stored in the header |
wasted_bytes | 2 | unknow (same as flac ???) |
isverbatim | 1 | if 1, the data is not compressed |
if (hasoutputsamples) { | ||
outputsamples | 32 | number of samples (sometimes the value is wrong [1]) |
} |
[1] http://www1.mplayerhq.hu/MPlayer/samples/A-codecs/lossless/luckynight.m4a need + 32 and http://www1.mplayerhq.hu/MPlayer/samples/A-codecs/lossless/ALAC/old_midi_stuff.m4a + 112
Verbatim frame
Syntax | Number of bits | Semantics |
---|---|---|
data | sample_size * outputsamples * channels | Unencoded subblock |
Compressed frame
Syntax | Number of bits | Semantics |
---|---|---|
interlacing_shift | 8 | should be 0 if no channel interlacing. |
interlacing_leftweight | 8 | |
for each channel { | ||
prediction_type | 4 | should be 0 |
prediction_quantitization | 4 | |
ricemodifier | 3 | |
predictor_coef_num | 5 | |
predictor_coef_table | 16 * predictor_coef_num | |
} | ||
for each channel { | ||
compressed data | modfied Rice coding and Adaptive FIR filter | |
} |
Channel Interlacing
It is a mid/side stereo with weight. channel 0 is the mid(average) channel, channel 1 is the side(difference) channel.
- right = mid - ((difference * interlacing_leftweight) >> interlacing_shift)
- left = right + difference
It seems we have interlacing_leftweight == interlacing_shift in most of the samples
Syntax | Number of bits | Semantics |
---|---|---|
EOF | 3 | should be always 7 |