HydrogenAudio

Lossless Audio Compression => FLAC => Topic started by: filoe on 2012-04-07 22:33:59

Title: FLAC Frame size
Post by: filoe on 2012-04-07 22:33:59
I am currently implementing a Flacdecoder into my project. Now i am having a huge Problem.
The SeekTable is not standart so I have to implement something i can seek on every flac stream. But how? I can't readout the framesize of the flacfile.
So what should i do now?

Does anyone know something?
Title: FLAC Frame size
Post by: Justin Ruggles on 2012-04-07 23:06:09
You could do what is done in Libav/FFmpeg.  FLAC frames do have a header identifier and 8-bit header CRC.  This gives decent probability of the next frame start.  Then taking it a step further, it checks for changing basic audio parameters to help identify false positives.  And further to that, it checks the 16-bit CRC of full consecutive frames (up to 10 frames in a row).  All of these combined works very well.

Edit: Note that just using the header identifier and header CRC will absolutely give false positives, so at least some continuity checking is needed.
Title: FLAC Frame size
Post by: filoe on 2012-04-08 11:19:17
i don t want to use other libarys because i am writing my own currently in c#.
But if I am right you want to tell me that i can use the crc8 and crc16 to calculate the next framestart or that framelength.
Could you may explain me where i can read how i can calculate the next frame start out of this or may you explain me how this works.
Would be really really nice because i don t have absolutely no idea.
Title: FLAC Frame size
Post by: Justin Ruggles on 2012-04-08 17:41:30
i don t want to use other libarys because i am writing my own currently in c#.
But if I am right you want to tell me that i can use the crc8 and crc16 to calculate the next framestart or that framelength.
Could you may explain me where i can read how i can calculate the next frame start out of this or may you explain me how this works.
Would be really really nice because i don t have absolutely no idea.

First see http://flac.sourceforge.net/format.html (http://flac.sourceforge.net/format.html) if you haven't already.

One way is of course just to decode from the beginning for each seek.  But if you want to avoid a full decode you can do some of the things I described in my previous reply.

Basically you want to start by searching for the next frame start code. Then you want to check to see if it might be a false positive.  The further you go with the validation, the more likely you are that you indeed have the correct next frame start. How much you want to validate depends on how much complexity you're willing to have relative to how sure you want to be that you have the correct position.