[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