Return to Basic Components of a SV8 stream.
Detect components:
Read two octets and then lookup in the following table:
Range | Possible meaning |
0000...1FFF | Length Label |
0000...0001 | impossible |
0002...1FFF | possible |
2000...3FFF | Cutted SV8 Audioframe |
2000...31FE | possible |
31FF...3FFF | impossible |
3FFF...7FFF | Tags, Sync Labels, Header |
4150 | APE Tag 2.0 |
4944 | ID3 Version 2.x Tag |
4D50 | SV7 / SV8 Header |
5441 | ID3 Version 1.x Tag |
664B | Transport Streaming Synchronization Label |
8000...FFDF | raw SV8 Audio frame |
FFE0...FFFF | MPEG Layer 1, 2 or 3 Frame |
FFE0...FFE7 | MPEG 2.5 |
FFF0...FFF7 | MPEG 2 |
FFF7...FFFF | MPEG 1 |
This only showns what may be possible. There're additional restriction which can be used to check validy of the component.
Determine size of components:
Resynchronization of Interchange File Format:
uint8_t* p; // Pointer to data stream uint16_t len_pre; uint16_t len_post; repeat: while ( (p[0] & 0xE0) || (p[2] & 0xE0) ) // search for two length labels (p=1.5%) p++; len_pre = p[2] * 256 + p[3]; // decode pre and post length label len_post = p[4 + len_pre] * 256 + p[5 + len_pre]; if ( len_pre != len_post ) { // they should be the same, otherwise continue with next byte (p=2ppm) p++; goto repeat; } if ( p[6 + len_pre] & 0xE0 ) { // after the post length label the pre length label of the next frame (p=0.24ppm) p++; // should be available goto repeat; } if ( determine_len (p+4) != len_pre ) { // test length of stream contents against length labels (p<1ppb) p++; goto repeat; } p += 4; // p points to the start of a raw audio frame