Musepack

From MultimediaWiki
Revision as of 00:16, 2 November 2007 by Kostya (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
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.

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.