Musepack

From MultimediaWiki
Revision as of 23:16, 1 November 2007 by Kostya (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Musepack is an open-source lossy audio codec based on MP2. It is a variable bit rate coder intended to produce perceptually transparent encoding.

There are several variations of Musepack known - SV(stream version) 4-6, 7 and 8. SV 4-6 are old and rarely used, SV8 is in beta stage.

SV7 container format

Look here for header format: SV7 Specification The header is followed by frames, each frames is preceded by 20-bit variable containing number of bits in this frame (frames are not byte-aligned)

SV7 frame format

Frame data defines one audio frames - 32 bands with 36 subband samples (total 1152 samples per frame).

All data for bands is stored interleaved - left band first, right band next. Except for band indexes, all data is stored only for bands with index != 0.

Band type (max_bands is stored in file header):

 for(i = 0; i <= max_bands; i++){
   for(ch = 0; ch < 2; ch++)
     band[i][ch] = get_vlc();
   if(band[i][0] != 0 || band[i][1] != 0)
     msflag[i] = getbit();
 }

Scale index coding method - one VLC for each non-zero band (i.e. band type != 0) Scale indexes - 1-3 VLCs per each non-zero band depending on scale index coding method Quantizer

 for each non-zero band {
   switch(band type){
   case -1: fill all 36 band samples with random values
   case  1: read 12 VLCs for 36 band samples
   case  2: read 18 VLCs for 36 band samples
   case  3-7: for each band sample read VLC using table depending on band type
   case  8-17: for each band sample read (band type - 1) bits
   default: zero all 36 band samples
   }
 }

SV8 format

Look here for details: SV8 Specification

SV8 frame format

Main differences from SV7:

  • keyframes
  • bitstream now is not stored in 32 LSB units
  • new Huffman codes

Quantizer reading:

 for each non-zero band {
   switch(band type){
   case -1: fill all 36 band samples with random values
   case  0: do nothing
   case  1: read VLC which contains flags for 18 samples, if flag is set, read one bit to fill sample
   case  2: read 12 VLCs for 36 band samples
   case  3-4: read 18 VLCs for 36 band samples
   case  5-8: for each sample read VLC depending on previously decoded sample
   default: for each sample read VLC and fixed number of bits
   }
 }

There is a tool in libmpc for lossless transcoding from SV7 to SV8, as only bitstream format has changed.