Apple Lossless Audio Coding

From MultimediaWiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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

Frame Footer

Syntax Number of bits Semantics
EOF 3 should be always 7