[flac-dev] Questions about FLAC documentation

Pierre-Yves Thoulon py.thoulon at gmail.com
Sat Oct 6 08:05:05 PDT 2012


I've implemented a full decoder in c# from the textual description and minimal access to the reference code. I think I had to do some research on Rice coding, though. 

The code is available at http://www.mjuware.com if that's of any help. 

Pyt.


On 6 oct. 2012, at 15:33, Tor-Einar Jarnbjo <tor-einar at jarnbjo.name> wrote:

> Am 06.10.2012 11:01, schrieb Gravis:
> 
>> In "FRAME_HEADER" there is a field of a variable size field with the
>> description "if(variable blocksize) \n <8-56> : 'UTF-8' coded sample
>> number (decoded number is 36 bits)" and I find the encoding scheme is
>> somehow alien (I can't figure out what it has to do with UTF-8)  and
>> it's two following fields to be incomprehensible.  There doesn't seem
>> to be any information indicating their purpose either.
> 
> Well, as the documentation states, it uses the same method as in UTF-8 
> to store variable length integers:
> 
> - read one byte B0 from the stream
> - if B0 = 0xxxxxxx then the read value is B0 -> end
> - if B0 = 10xxxxxx, the encoding is invalid
> - if B0 = 11xxxxxx, set L to the number of leading binary 1s minus 1:
>     B0 = 110xxxxx -> L = 1
>     B0 = 1110xxxx -> L = 2
>     B0 = 11110xxx -> L = 3
>     B0 = 111110xx -> L = 4
>     B0 = 1111110x -> L = 5
>     B0 = 11111110 -> L = 6
> - assign the bits following the encoding (the x bits in the examples) to 
> a variable R with a magnitude of at least 56 bits
> - loop from 1 to L
>     - left shift R 6 bits
>     - read B from the stream
>     - if B does not match 10xxxxxx, the encoding is invalid
>     - set R = R or <the lower 6 bits from B>
> - the read value is R
> 
> The following two fields depend on the block size and sample rate index 
> read earlier in the header:
> 
> - If blocksize index = 6, read 8 bits from the stream. The true block 
> size is the read value + 1.
> - If blocksize index = 7, read 16 bits from the stream. The true block 
> size is the read value + 1.
> 
> - If sample index is 12, read 8 bits from the stream. The true sample 
> rate is the read value * 1000.
> - If sample index is 13, read 16 bits from the stream. The true sample 
> rate is the read value.
> - If sample index is 14, read 16 bits from the stream. The true sample 
> rate is the read value * 10.
> 
>> The location and coding of audio samples is very nebulous in that I
>> don't know where they are or the specifics of how any of their
>> encoding scheme work.  More details, links to more information and
>> maybe even some pseudo code would be very helpful.  The documentation
>> about the metadata is great...  but it kinda goes downhill after that.
>>  It would be fantastic if someone could update the documentation with
>> more information and details.
> 
> It's almost 10 years ago, so I am not 100% sure, but I think I 
> implemented the FLAC decoder in the J-Ogg project based only on the 
> textual specification. It may of course be that I checked the reference 
> implementation for details, but I don't think so. What is your exact 
> problem? The specification may not be perfect, but it should be 
> understandable. Perhaps it may help you to consult the Java source from 
> J-Ogg: http://www.j-ogg.de/j-ogg.zip. It should be more readable than 
> the reference implementation. The actual PCM decoding is implemented in 
> the Subframe class in the FLAC directory.
> 
> Tor
> 
> 
> _______________________________________________
> flac-dev mailing list
> flac-dev at xiph.org
> http://lists.xiph.org/mailman/listinfo/flac-dev


More information about the flac-dev mailing list