VocPack
- Description: VocPack
From the description, this appears to be one of the earliest lossless codecs: it dates from 1993. Two versions of the encoder/decoder are available on the site listed above
File structure:
4 bytes - NFVP (probably Nicola Ferioli and VocPack) 1 byte - compression method (0 - unsigned 8-bit audio, 1 - signed 8-bit audio, 0x20 - version 2.0) 4 bytes - number of coded samples [v2 only] 1 byte - packed parameters (bit 1 - stereo, bit 2 - 16-bit input, bits 3-5 - number of initial raw bytes) [v2 only] 1-33 bytes - zero-terminated original filename packed audio data
In both versions audio data is first predicted using adaptive order-2 predictor and then the difference is compressed using context adaptive models and binary arithmetic coder.
VocPack 1.0
This version compresses only 8-bit mono audio.
Prediction process:
pred = clip((last * lastcoef + last2 * last2coef) >> 10, -128, 127);
Predictor update:
if last > 0 { lastcoef += 5 * diff; } else { lastcoef -= 5 * diff; } if last2 > 0 { last2coef += 2 * diff; } else { last2coef -= 2 * diff; } last2 = last; last = sample;
Difference coding uses a set of 64 adaptive models with 256 elements each initially initialised to 1. The next model index is ((uint8_t)prev_decoded_val) >> 2
. Each decoded element frequency is updated by adding 256 and if the total sum of frequency reaches 64000 the frequencies are halved as (freq >> 1) + 1
.
VocPack 2.0
This version supports 16-bit and stereo audio. In case of stereo channels are coded independently. In case of 16-bit audio low byte of input sample is stored raw and only top byte is coded in a method very similar to version 1.0.
Version 2 predictor uses shift by 9 and the following update method:
if last > 0 { lastcoef += diff * 2; } else { lastcoef -= diff * 2; } lastcoef = clip(lastcoef, 500, 1500); if last2 > 0 { last2coef += diff; } else { last2coef -= diff; } last2coef = clip(last2coef, -750, -250);
Difference is coded using a different model based on similar approaches.