FLAC Agent Build: Difference between revisions

From mywiki
Jump to navigation Jump to search
Line 228: Line 228:
* 0b_0  Mandatory 0.   
* 0b_0  Mandatory 0.   
|-
|-
| 2358 || SDC || read_frame_header_ || '''0b1100''' || Read 4 bits frame.header.blocksize = 256 << (x-8) 4096 256 * 2<sup>4</sup> .
| 2358 || SDC || read_frame_header_ || '''0b1100''' || 4 bits frame.header.blocksize = 256 << (x-8) 4096 256 * 2<sup>4</sup> .
|-
|-
| 2379 || SDC || read_frame_header_ || '''0b0011''  || Read 4 bits map 3 to 192000 frame.header.sample_rate = 192000
| 2379 || SDC || read_frame_header_ || '''0b0011'''  || 4 bits map 3 to 192000 frame.header.sample_rate = 192000
|-  
|-
| 2423 || SDC || read_frame_header_ || '''0b1000'''  || 4 Bits map to left side channel frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE;
|-
| 2364 || SDC || read_frame_header_ || '''0b110'''  || 3 bits map to 24 bps frame.header.bits_per_sample = 24
|-
 
|}
|}



Revision as of 16:26, 27 November 2024


EditDate 2024-08-06

Related Threads: FLAC Agent

I am building a self-learning FLAC Agent and this will track the trials and tribulations of the build here.

I decided to loose my agent against flac files on the NVDIA GPU I have so closed on using C/C++ and CUDA.

Got linker to work. created a.out in Debug directory

Corrected the linker so it's now debuggable and gdb allows me to see assembler code so I'm finally talking directly to the machine again.

Brings me back.Web References https://developer.nvidia.com/cuda-toolkit, https://xiph.org/flac/, https://ftp.osuosl.org/pub/xiph/releases/flac/

I want to build an agent that will read flac music files and identify patterns in them. Once it has the patterns identified I want to see if can draw images in line with the evolving songs and long term improvise based on optimum patterns. Very long term may play sounds that draw a message the machine wants to tell us.

Log

--Johnny (talk) 17:41, 21 November 2024 (UTC) Printed off stream_decoder.c from FLAC xiph code and tracing through documenting reads from file. So far seems they do way more 8 bit and less reads than I'll need. See below for sequence of reads.

Johnny (talk) 20:53, 14 November 2024 (UTC) 2 break throughs today. Found shorten a program from Tony Robinson at Cambridge that is the compression logic behind flac and it’s in C. File:Robinson tr156.ps


Johnny (talk) 15:43, 14 November 2024 (UTC) Well I think I figured it out, going to check this afternoon. In the export session I was sending both mono tracks to the left and right stereo channels so naturally they were identical. Garbage in garbage out. Going to try splitting them. Top voice to right channel and bottom guitar to the left hand of God. —Johnny (talk) 12:58, 14 November 2024 (UTC) Tan into core problem last night. Channel/Track 0===1. Need to determine where in file creation scheme this is happening.

--Johnny (talk) 11:02, 29 October 2024 (UTC) Reading the flac file and starting to breakdown metadata. Expect to lift and streamline decoding code. Just found out we can create our own metadata bloc and hope to store successive passes of agent there.

--Johnny (talk) 20:51, 6 August 2024 (UTC) Got linker to work.

--Johnny (talk) 19:14, 6 August 2024 (UTC) First had to get a working version of Eclipse that ran on the version of Ubuntu I had. This required updating Eclipse to include the development version so I am currently running Eclipse version=4.32.0 and Ubuntu Oracular Oriole (development branch) which was the only version I found that allowed my instruction debug due to comaptibility issues after Ubuntu updated to Wayland from X11.

Once I had a working development environment I install [ttps://ftp.osuosl.org/pub/xiph/releases/flac/ libFLAC] Unfortunately I've been unable to get a clean link in the development environment so I'm now trying Configure C project with cmake in eclipse manual method to assemble and successfully compile decoder.

Analyze flac stream

The math behind it all File:Robinson tr156.ps.

0000:0000 | 66 4C 61 43  00 00 00 22  10 00 10 00  00 01 59 00 | fLaC..."......Y.
0000:0010 | 1D 88 2E E0  03 70 04 BE  30 D0 4F CA  4A C4 B1 96 | ...à.p.¾0ÐOÊJı.
0000:0020 | E4 DE 2B A3  C8 66 BD 20  A4 31 03 00  02 F4 00 00 | äÞ+£Èf½ ¤1...ô..
0000:0030 | 00 00 00 00  00 00 00 00  00 00 00 00  00 00 10 00 | ................
0000:0040 | 00 00 00 00  00 1D 40 00  00 00 00 00  00 2C 42 C9 | ......@......,BÉ
0000:0050 | 10 00 00 00  00 00 00 3A  90 00 00 00  00 00 00 5A | .......:.......Z
0000:0060 | B2 A9 10 00  00 00 00 00  00 57 E0 00  00 00 00 00 | ²©.......Wà.....
0000:0070 | 00 89 59 38  10 00 00 00  00 00 00 75  30 00 00 00 | ..Y8.......u0...
0000:0080 | 00 00 00 B8  D2 F6 10 00  00 00 00 00  00 92 70 00 | ...¸Òö........p.
0000:0090 | 00 00 00 00  00 E7 CB 21  10 00 00 00  00 00 00 AF | .....çË!.......¯
0000:00A0 | C0 00 00 00  00 00 01 17  62 29 10 00  00 00 00 00 | À.......b)......
0000:00B0 | 00 CD 10 00  00 00 00 00  01 46 C7 46  10 00 00 00 | .Í.......FÇF....
0000:00C0 | 00 00 00 EA  60 00 00 00  00 00 01 76  C5 7E 10 00 | ...ê`......vÅ~..
0000:00D0 | 00 00 00 00  01 07 A0 00  00 00 00 00  01 A6 43 11 | ...... ......¦C.
0000:00E0 | 10 00 00 00  00 00 01 24  F0 00 00 00  00 00 01 D6 | .......$ð......Ö
0000:00F0 | 3E CE 10 00  00 00 00 00  01 42 40 00  00 00 00 00 | >Î.......B@.....
0000:0100 | 02 06 0E DF  10 00 00 00  00 00 01 5F  90 00 00 00 | ...ß......._....
0000:0110 | 00 00 02 35  51 2A 10 00  00 00 00 00  01 7C D0 00 | ...5Q*.......|Ð.
0000:0120 | 00 00 00 00  02 64 C4 5D  10 00 00 00  00 00 01 9A | .....dÄ]........
0000:0130 | 20 00 00 00  00 00 02 94  36 7C 10 00  00 00 00 00 |  .......6|......
0000:0140 | 01 B7 70 00  00 00 00 00  02 C3 E5 15  10 00 00 00 | .·p......Ãå.....
0000:0150 | 00 00 01 D4  C0 00 00 00  00 00 02 F3  EE 56 10 00 | ...ÔÀ......óîV..
0000:0160 | 00 00 00 00  01 F2 00 00  00 00 00 00  03 23 B2 77 | .....ò.......#²w
0000:0170 | 10 00 00 00  00 00 02 0F  50 00 00 00  00 00 03 53 | ........P......S
0000:0180 | 78 02 10 00  00 00 00 00  02 2C A0 00  00 00 00 00 | x........, .....
0000:0190 | 03 83 A9 4D  10 00 00 00  00 00 02 49  F0 00 00 00 | ..©M.......Ið...
0000:01A0 | 00 00 03 B2  CA 1E 10 00  00 00 00 00  02 67 30 00 | ...²Ê........g0.
0000:01B0 | 00 00 00 00  03 E2 21 59  10 00 00 00  00 00 02 84 | .....â!Y........
0000:01C0 | 80 00 00 00  00 00 04 11  6A 20 10 00  00 00 00 00 | ........j ......
0000:01D0 | 02 A1 D0 00  00 00 00 00  04 40 99 8E  10 00 00 00 | .¡Ð......@......
0000:01E0 | 00 00 02 BF  20 00 00 00  00 00 04 70  26 72 10 00 | ...¿ ......p&r..
0000:01F0 | 00 00 00 00  02 DC 60 00  00 00 00 00  04 9F AC 04 | .....Ü`.......¬.
0000:0200 | 10 00 00 00  00 00 02 F9  B0 00 00 00  00 00 04 CF | .......ù°......Ï
0000:0210 | 68 DE 10 00  00 00 00 00  03 17 00 00  00 00 00 00 | hÞ..............
0000:0220 | 04 FF BB 39  10 00 00 00  00 00 03 34  50 00 00 00 | .ÿ»9.......4P...
0000:0230 | 00 00 05 30  0F 68 10 00  00 00 00 00  03 51 90 00 | ...0.h.......Q..
0000:0240 | 00 00 00 00  05 5F BE 20  10 00 00 00  00 00 03 6E | ....._¾ .......n
0000:0250 | E0 00 00 00  00 00 05 8F  2A F4 10 00  00 00 00 00 | à.......*ô......
0000:0260 | 03 8C 30 00  00 00 00 00  05 BE CE 03  10 00 00 00 | ..0......¾Î.....
0000:0270 | 00 00 03 A9  80 00 00 00  00 00 05 EE  42 EF 10 00 | ...©.......îBï..
0000:0280 | 00 00 00 00  03 C6 C0 00  00 00 00 00  06 1E 70 80 | .....ÆÀ.......p.
0000:0290 | 10 00 00 00  00 00 03 E4  10 00 00 00  00 00 06 4E | .......ä.......N
0000:02A0 | 24 95 10 00  00 00 00 00  04 01 60 00  00 00 00 00 | $.........`.....
0000:02B0 | 06 7E 2E 0E  10 00 00 00  00 00 04 1E  B0 00 00 00 | .~..........°...
0000:02C0 | 00 00 06 AE  5B CB 10 00  00 00 00 00  04 3B F0 00 | ...®[Ë.......;ð.
0000:02D0 | 00 00 00 00  06 DD 86 77  10 00 00 00  00 00 04 59 | .....Ý.w.......Y
0000:02E0 | 40 00 00 00  00 00 07 0D  D9 09 10 00  00 00 00 00 | @.......Ù.......
0000:02F0 | 04 76 90 00  00 00 00 00  07 3D 1D 71  10 00 00 00 | .v.......=.q....
0000:0300 | 00 00 04 93  E0 00 00 00  00 00 07 6C  91 E0 10 00 | ....à......l.à..
0000:0310 | 00 00 00 00  04 B1 20 00  00 00 00 00  07 9A A0 3A | .....± ....... :
0000:0320 | 10 00 04 00  00 28 20 00  00 00 72 65  66 65 72 65 | .....( ...refere
0000:0330 | 6E 63 65 20  6C 69 62 46  4C 41 43 20  31 2E 34 2E | nce libFLAC 1.4.
0000:0340 | 33 20 32 30  32 33 30 36  32 33 00 00  00 00 81 00 | 3 20230623......
0000:0350 | 20 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00 |  ...............
0000:0360 | 00 00 00 00  00 00 00 00  00 00 00 00  00 00 00 00 | ................
...
0000:2350 | 00 00 FF F8  C3 8C 00 F0  4E FF 89 81  FF 8E 74 FF | ..ÿøÃ..ðNÿ..ÿ.tÿ
0000:2360 | 92 E9 FF 95  46 FF 91 DF  FF 8E A2 FF  86 61 FF 7B | .éÿ.Fÿ.ßÿ.¢ÿ.aÿ{
0000:2370 | 71 E6 9D E5  5C 51 8B 82  7F A0 C1 74  22 E0 5C B9 | qæ.å\Q... Át"à\¹
0000:2380 | 37 01 44 FD  4F D1 7F 19  7F F6 EE B2  25 0A 26 56 | 7.DýOÑ...öî²%.&V
0000:2390 | 9F 5B 33 62  79 5D 10 9D  13 35 7A 15  24 65 0E B4 | .[3by]...5z.$e.´
0000:23A0 | 2A 4B E2 CB  CE E3 CE 5F  29 4C 5D 64  19 3A 10 10 | *KâËÎãÎ_)L]d.:..
0000:23B0 | 59 1D D1 05  A1 08 D6 D0  48 55 8A 5E  6A 7B A4 C2 | Y.Ñ.¡.ÖÐHU.^j{¤Â
0000:23C0 | 40 12 67 E4  60 3E 4B CB  E3 AD 01 86  B8 6B 7B 62 | @.gä`>KËã...¸k{b

Trace of reads

Acronyms:

SDC  = Stream_Decoder.c
BitR - Bitreader.c

Metadata Reads

Streaminfo Metadata Block 0
Line Number Code Package Module Value Opertion Description
1339 SDC Find Metadata fLaC
0x_664C6143
Verifying 8 bits at a time that file starts with fLAc.
1394 SDC Read Metadata 0b_0 Read 1 bit to determine last metadata block..
1398 SDC Read Metadata 0b_0000000 Read 7 bits. Metadata Type 0 Streaminfo
1401 SDC Read Metadata 0x_000022 Read 24 bits indicating length 34.
1578 SDC Read StreamInfo 0x664C614300000022 Read 34 bytes 0x_22 into Streaminfo structure
  1. 0x1000 4096 Minimum Blocksize 16 bits
  2. 0x1000 4096 Maximum Blocksize 16 bits
  3. 0x000159 345 Minimum Framesize 24 bits
  4. 0x001D88 7560 Maximum Framesize 24 bits
  5. 0x2EE00 192000 Samplerate 20 bits
  6. 0b001 1 Channels 3 bits + 1 = 2 Channels
  7. 0b10111 23 5 bits Bits per sample = 23 + 1
  8. 0x004BE30D0 79.573,200 36 bits number of samples
  9. mdsum 16 Bytes (8*16 bits)
  10. skip rest of block length(34) - used bits(272)/8 = 0
SeekTable Metadata Block 1
Metadata Reads Looking for Last
Line Number Code Package Module Value Operation Description
1040 SDC Decode till End Meta case FLAC__STREAM_DECODER_READ_METADATA Read all Metadata Blocks
1394 SDC Read Metadata 0b_0 Read 1 bit to determine last metadata block.
1398 SDC Read Metadata 0b_0000011 Read 7 bits. Metadata Type 3 FLAC__METADATA_TYPE_SEEKTABLE
1401 SDC Read Metadata 0x_0002F4 Read 24 bits indicating length 756. Will determine later if we need seektable information
Metadata Block 2
Line Number Code Package Module Value Operation Description
1040 SDC Decode till End Meta case FLAC__STREAM_DECODER_READ_METADATA Read all Metadata Blocks
1394 SDC Read Metadata 0b_0 Read 1 bit to determine last metadata block.
1398 SDC Read Metadata 0b_0000100 Read 7 bits. Metadata Type 4 FLAC__METADATA_TYPE_VORBIS_COMMENT
1401 SDC Read Metadata 0x_000028 Read 24 bits indicating length 40.
1478 SDC Read Metadata 4 Type 4 case FLAC__METADATA_TYPE_VORBIS_COMMENT
Metadata Block 2
Line Number Code Package Module Value Operation Description
1040 SDC Decode till End Meta case FLAC__STREAM_DECODER_READ_METADATA Read all Metadata Blocks
1394 SDC Read Metadata 0b_1 Read 1 bit to determine last metadata block last=true.
1398 SDC Read Metadata 0b_0000001 Read 7 bits. Metadata Type 1 FLAC__METADATA_TYPE_PADDING:
1401 SDC Read Metadata 0x002000 Read 24 bits indicating length 8192.
1453 SDC Read Metadata skip_it=true Type 1 FLAC__METADATA_TYPE_PADDING: skip to 2352

Data Reads

Sync Frame
FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC
Line Number Code Package Module Value Opertion Description
1047 SDC Find Metadata 0xFFF8 FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC FFF8
1071 SDC stream decoder process 0xFFF8 FLAC__stream_decoder_process_until_end_of_stream
1989 SDC frame_sync_ 0xFFF8 Read 7 bits. Metadata Type 0 Streaminfo
418 BRC FLAC__bitreader_read_raw_uint32 0xFFF8 Read 8 bits at a time validating each byte.
2009 SDC frame_sync_ 0b1111 1111 FF start right at end of metadata padding. 2532
2020 SDC frame_sync_ 0b1111 10 Right shift F8 to 0x_7c
Read Frame Header Metadata

Starting at 0x_2354 FF80 C38C

  • 0b_1111 1111 10 Frame Header sync'
  • 0b_0 mandatory 0 value Validation
  • 0b_0 0 = fixed blocking strategy Fixed Blocks or Not
  • 0b_1100 0x_C 12-8 = 4 so 2 to the 4th power = 16 time 256 = 4096 samples. ( 2358 SDC read frame header) frame blocksize
  • 0b_0011 0x3 3 sample rate 192,000 ( 2379 SDC read frame header) samplerate'
  • 0b1000 8 left/side stereo: channel 0 is the left channel, channel 1 is the side(difference) channel ( 2423 SDC read frame header) Channel Handling
  • 0b110 = C 24 bits per sample bps
  • 0b_0 Mandatory 0. Validation
Read Warmup
Iterate Predictor Order
Line Number Code Package Module Value Operation Description
3700 SDC file_tell_callback_ 0x4000 Absolute position 16,384
889 SDC FLAC__stream_decoder_get_decode_position 0_x2354 Start of Frame after frame header at 9044 in.
1075 SDC stream decoder process case FLAC__STREAM_DECODER_READ_FRAME: Read Frame
2041 SDC read_frame 0x_0002F4 Read frame to decode.
350 BRC FLAC__bitreader_reset_read_crc16 reset crc FLAC__bitreader_reset_read_crc16
2277 SDC read_frame_header_ 0x_FFF8C38C Frame header breakdown
  • 0b_1111 1111 10 Frame Header
  • 0b_0 mandatory 0 value
  • 0b_0 0 = fixed blocking strategy
  • 0b_1100 0x_C 12-8 = 4 so 2 to the 4th power = 16 time 256 = 4096 samples. ( 2358 SDC read frame header)
  • 0b_0011 0x3 3 sample rate 192,000 ( 2379 SDC read frame header)
  • 0b1000 8 left/side stereo: channel 0 is the left channel, channel 1 is the side(difference) channel ( 2423 SDC read frame header)
  • 0b110 = C 24 bits per sample
  • 0b_0 Mandatory 0.
2358 SDC read_frame_header_ 0b1100 4 bits frame.header.blocksize = 256 << (x-8) 4096 256 * 24 .
2379 SDC read_frame_header_ 0b0011 4 bits map 3 to 192000 frame.header.sample_rate = 192000
2423 SDC read_frame_header_ 0b1000 4 Bits map to left side channel frame.header.channel_assignment = FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE;
2364 SDC read_frame_header_ 0b110 3 bits map to 24 bps frame.header.bits_per_sample = 24
Position Past Optional Frame Headers
Frame Header 2
Line Number Code Package Module Value Operation Description
2499 SDC read_frame_header_ FIxed Block size UTF8 -> BRC
928 BRC FLAC__bitreader_read_utf8_uint32 0b_0000 Read 4 bits to determine optional data.
934 Call 32 uint read for 8 bits
934 BRC FLAC__bitreader_read_raw_uint32 0x_00 Read full byte even though only 4 bits requested
2509 SDC read_frame_header 0x00 Frame 0
2554 SDC read_frame_header 0x_F0 Read next 8 bits
Warmup

One entry for each prdictor order so in this case 8 entries from 2359 to 2371

  • 0xffffffffffff8981
  • 0xffffffffffff8e74
  • 0xffffffffffff92e9
  • 0xffffffffffff9546
  • 0xffffffffffff91df
  • 0xffffffffffff8ea2
  • 0xffffffffffff8661
  • 0xffffffffffff7b71
Warmup
Line Number Code Package Module Value Operation Description
2554 SDC read_frame_header 0x_F0 Read next 8 bits -> uint 32
934 BRC FLAC__bitreader_read_raw_uint32 0x_F0 Read next byte.
2556 SDC read_frame_header 0xF0 crc8 = 0x_F) 240
2072 SDC read_frame 0x_F0 Read Left Side Set 2 Channels
2600 SDC read_subframe 0x_78 read uint 8 bits then 24 bit sequences
2666 SDC read_subframe 0x_78 Set predictor_order ((78>>1)&31)+1 = 8
2806 SDC read_subframe_lpc 0x_F0 24 bits 1 for each predictor order
2823 SDC read_subframe_lpc 0xff8981 predictor order = 8 so 8 64 bit warm-ups loaded starting at 2359 stopping 2371.
  • 0xffffffffffff8981
  • 0xffffffffffff8e74
  • 0xffffffffffff92e9
  • 0xffffffffffff9546
  • 0xffffffffffff91df
  • 0xffffffffffff8ea2
  • 0xffffffffffff8661
  • 0xffffffffffff7b71
qlp_coeff
Frame Header 2
Line Number Code Package Module Value Operation Description
2834 SDC read_subframe_lpc 0x_E Read 4 bits 0x_E set qlp_coeff_precision = 14
2844 SDC read_subframe_lpc 0b_01101 read 5 bits 6+0b_1 at end top bit of 9 = 13 quantization_level
2850 SDC read_subframe_lpc 8 entries read 8 sets of 15 bits each one a qlp_coeff
  1. 0x1de5 7653
  2. 0x2e28 11816
  3. 0xffffe2e0 -7456
  4. xffffcff4 -12300
  5. 0xc17 3095
  6. 0x2117 8471
  7. 0x172 370
  8. 0xfffff26e -3474

2371

 9DE5                         5C51                              8B82                    7FA0
x001 1101 1110 0101        010 1110 0010 1000          1110 0010 1110 0000       1100 1111 1111 0100 000                 
   1   D    E    5          2    E    2    8             E    2    E    0           C    F    F    4            
 
 C174                         22E0                              5CB9                     3701  
000 1100 0001 0111     010 0001 0001 0111           000 0001 0111 0010      111 0010 0110 1110      000                                                                    
 0    C    1    7       2   1     1     7            0    1    7    2        F     2    6    E                      


  • qlp_coeff_precision = 1 + 14 0x_E at 2371 4 Bits This is the number of bits in each qlp_coeff.
  • quantization_level = 13 2372.5 for 5 bits
  • qlp_coeff[]
  1. 0x1de5 7653
  2. 0x2e28 11816
  3. 0xffffe2e0 -7456
  4. xffffcff4 -12300
  5. 0xc17 3095
  6. 0x2117 8471
  7. 0x172 370
  8. 0xfffff26e -3474
qlp_coeff Function=

function qlp_coefF (file_parameters, *file, alignment_adjust) {{

  1. align start qlp_coef bits
  2. read all bits
  3. convert buffer to individual qlp_coef
  4. store in file_parameters
  5. set file to right location to continue
  6. return adjustment is successful
  7. return -1 if fail

}}

 So to do this we need to read 15 bits into a register.   They do it with shift and & .  
  1. Word for buffer read
  2. Predictor for
    1. Shift to final position
    2. And to clear high order bits
  3. Process through word
  4. End of word not at predictor order boundary exception condition.
Next Edit

File Data

word = 0x370144fd4fd17f19
bits read in previous routine b0011 0111 0 X37.b0
starting bits 0b000 0001 the 0x44
Frame Header 2
Line Number Code Package Module Value Operation Description
2854 SDC read_subframe_lpc 0b_00 Read 2 bits 0 location 2381 01 0b0000 0001 first 0 bit used earlier in qlp_coeff so second and third 1 and 2 bits. Entropy coding method 0
2860 SDC read_subframe_lpc 0b_0000 read 4 bits
2881 SDC read_subframe_lpc 0 GoTo read_residual_partitioned_rice_
2950 SDC read_residual_partitioned_rice_ 0x_F0 24 bits 1 for each predictor order
2956 SDC read_residual_partitioned_rice_ NA partition_samples = decoder->private_->frame.header.blocksize >> partition_order = 4096
2863 SDC read_residual_partitioned_rice_ 0b_0000 GoTo FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size
590 format.c FLAC__format_entropy_coding_method_partitioned_rice_contents_ensure_size 0 GoTo read_residual_partitioned_rice_
2950 SDC read_residual_partitioned_rice_ 0x_F0 Reserve required memory
2972 SDC read_residual_partitioned_rice_ 0b1010 Read 4 bits partitioned_rice_contents->parameters[partition] = rice_parameter = 10 0b1010 0xA
Location 2382.b3 0
2975 SDC read_residual_partitioned_rice_ NA partition_samples - predictor_order 4096 - 8 = 4088

Next steps need to determine length of rice read.

Flac overview

  1. Metadata Block Header
    1. <1> Last-metadata-block flag: '1' if this block is the last metadata block before the audio blocks, '0' otherwise.
    2. <7> BLOCK_TYPE
      1. 0 : STREAMINFO
      2. 1 : PADDING
      3. 2 : APPLICATION
      4. 3 : SEEKTABLE
      5. 4 : VORBIS_COMMENT
      6. 5 : CUESHEET
      7. 6 : PICTURE
      8. 7-126 : reserved
      9. 127 : invalid, to avoid confusion with a frame sync code
    3. <24> Length (in bytes) of metadata to follow (does not include the size of the METADATA_BLOCK_HEADER)
  2. Streaminfo Mandatory Metadata Block
    1. <16> The minimum block size (in samples) used in the stream.
    2. <16> The maximum block size (in samples) used in the stream. (Minimum blocksize == maximum blocksize) implies a fixed-blocksize stream.
    3. <24> The minimum frame size (in bytes) used in the stream. May be 0 to imply the value is not known.
    4. <24> The maximum frame size (in bytes) used in the stream. May be 0 to imply the value is not known.
    5. <20> Sample rate in Hz. Though 20 bits are available, the maximum sample rate is limited by the structure of frame headers to 655350Hz. Also, a value of 0 is invalid.
    6. <3> (number of channels)-1. FLAC supports from 1 to 8 channels
    7. <5> (bits per sample)-1. FLAC supports from 4 to 32 bits per sample.
    8. <36> Total samples in stream. 'Samples' means inter-channel sample, i.e. one second of 44.1Khz audio will have 44100 samples regardless of the number of channels. A value of zero here means the number of total samples is unknown.
    9. <128> MD5 signature of the unencoded audio data. This allows the decoder to determine if an error exists in the audio data even when the error does not result in an invalid bitstream.
    10. NOTES
    11. FLAC specifies a minimum block size of 16 and a maximum block size of 65535, meaning the bit patterns corresponding to the numbers 0-15 in the minimum blocksize and maximum blocksize fields are invalid.
  3. Flac format

Decompose test.flac

  1. 0-4 "fLaC" ID Bytes

0 Metadata Block Streaminfo (Mandatory) 0

Metadata Block Header Streaminfo 0
Value Hex Description Number Bits
fLAc 664C 6143 fLAc Streaminfo Identity tag 4 bytes
0 "0(b)" Not last Metadata Block 1 Bit
0 "0000000(b)" Streaminfo Block type 7 Bits
34 "000022" Metadata Block length hex 22 24 Bits
Metadata Block Data
Value Hex Description Number Bits
4,096 "1000" The minimum block size (in samples) used in the stream. 16 Bits
4,096 "1000" The maximum block size (in samples) used in the stream. 16 Bits
345 "000159" The minimum frame size (in bytes) used in the stream. May be 0 to imply the value is not known. 24 Bits
7,560 "001D88" The minimum frame size (in bytes) used in the stream. May be 0 to imply the value is not known. 24 Bits
192,000 "2EE00" Sample rate in Hz. Though 20 bits are available, the maximum sample rate is limited by the structure of frame headers to 655350Hz. Also, a value of 0 is invalid. 20 Bits
2 "001(b)" (number of channels)-1. FLAC supports from 1 to 8 channels 3 Bits
24 "10111(b)" (bits per sample)-1. FLAC supports from 4 to 32 bits per sample. 5 Bits
79573200 "004BE30D0" Total samples in stream. 'Samples' means inter-channel sample, i.e. one second of 44.1Khz audio will have 44100 samples regardless of the number of channels. A value of zero here means the number of total samples is unknown. 36 Bits
NA "4FCA4AC4B196E4DE2BA3C866BD20A431" MD5 signature of the unencoded audio data. This allows the decoder to determine if an error exists in the audio data even when the error does not result in an invalid bitstream. 128 Bits

1 Metadata Block SeekTable 2A

SeekTable 2A The number of seek points is implied by the metadata header 'length' field, i.e. equal to length / 18.
Value Hex Description Number Bits
0 "0" Not last Metadata Block 1 Bit
3 "0000011(b)" SeekTable Block type 7 Bits
756 "0002F4" Number of seek points 42 24 Bits
Metadata Block Data
Value Hex Description Number Bits
0 Seek point
0 "0000000000000000" 0 Seek Point Sample number of first sample in the target frame. 64 Bits
0 "0000000000000000" Offset (in bytes) from the first byte of the first frame header to the first byte of the target frame's header. 64 Bits
4,096 "1000" Number of samples in the target frame. 16 Bits
1 Seek Point
1916928 "00000000001D4000" 1 Seek Point Sample number of first sample in the target frame. 64 Bits
2900681 "00000000002C42C9" Offset (in bytes) from the first byte of the first frame header to the first byte of the target frame's header. 64 Bits
4,096 "1000" Number of samples in the target frame. 16 Bits
2 Seek Point
3837952 "00000000003A9000" 2 Seek Point Sample number of first sample in the target frame. 64 Bits
5943977 "00000000005AB2A9" Offset (in bytes) from the first byte of the first frame header to the first byte of the target frame's header. 64 Bits
0 "1000" Number of samples in the target frame. 16 Bits
3 Seek Point
5758976 "000000000057E000" 3 Seek Point Sample number of first sample in the target frame. 64 Bits
9001272 "0000000000895938" Offset (in bytes) from the first byte of the first frame header to the first byte of the target frame's header. 64 Bits
4,096 "1000" Number of samples in the target frame. 16 Bits
...Last Seek Point
78716928 "0000000004B12000" Last Seek Point Sample number of first sample in the target frame. 64 Bits
127574074 "00000000079AA03A" Offset (in bytes) from the first byte of the first frame header to the first byte of the target frame's header. 64 Bits
4,096 "1000" Number of samples in the target frame. 16 Bits

2 Metadata Block Vorbis 322

Metadata Block Header 2 (Voorbis) 322
Value Hex Description Number Bits
0 "0(b)" Not last Metadata Block 1 Bit
4 "0000100(b)" Voorbis Block type 7 Bits
40 "000028" Metadata Block length 24 Bits

Block Data not Pertinent at this time

3 Metadata Block Padding 34E

Metadata Block Header 34E (Padding)
Value Hex Description Number Bits
1 "1" Is last Metadata Block 1 Bit
1 "0000001(b)" Padding Block type 7 Bits
8192 "002000" Metadata Block length 24 Bits

Block Data not pertinent

0 Stream Frame Header 2352

Flac Architecture

FF F8 C3 8C 00 F0 4E FF 89 81 FF 8E 74 FF 92 E9 FF 95 46 FF 91 DF FF 8E A2 FF 86 61 FF 7B 71 E6 9D E5

0 Stream Frame 2352
Value Hex Description Number Bits
FFF8 1111 1111 1111 10(b) FFF8 Sync code '11111111111110' 14 bits
0 "0(b)" Reserved: [1] Mandatory Value 0 1 Bit
0 "0(b)" Blocking strategy:
  • 0 : fixed-blocksize stream; frame header encodes the frame number
  • 1 : variable-blocksize stream; frame header encodes the sample number
1 Bit
C 1100 "1100(b)" Block size in inter-channel samples:
  • 0000 : reserved
  • 0001 : 192 samples
  • 0010-0101 : 576 * (2^(n-2)) samples, i.e. 576/1152/2304/4608
  • 0110 : get 8 bit (blocksize-1) from end of header
  • 0111 : get 16 bit (blocksize-1) from end of header
  • 1000-1111 : 256 * (2^(n-8)) samples, i.e. 256/512/1024/2048/4096/8192/16384/32768
4 Bits
3 0011 "0011(b)" Sample rate:
  • 0000 : get from STREAMINFO metadata block
  • 0001 : 88.2kHz
  • 0010 : 176.4kHz
  • 0011 : 192kHz
  • 0100 : 8kHz
  • 0101 : 16kHz
  • 0110 : 22.05kHz
  • 0111 : 24kHz
  • 1000 : 32kHz
  • 1001 : 44.1kHz
  • 1010 : 48kHz
  • 1011 : 96kHz
  • 1100 : get 8 bit sample rate (in kHz) from end of header
  • 1101 : get 16 bit sample rate (in Hz) from end of header
  • 1110 : get 16 bit sample rate (in tens of Hz) from end of header
  • 1111 : invalid, to prevent sync-fooling string of 1s
4 Bits
8 1000 "1000(b)" Channel assignment
  1. 0000-0111 : (number of independent channels)-1. Where defined, the channel order follows SMPTE/ITU-R recommendations. The assignments are as follows:
    1. channel: mono
    2. channels: left, right
    3. channels: left, right, center
    4. channels: front left, front right, back left, back right
    5. channels: front left, front right, front center, back/surround left, back/surround right
    6. channels: front left, front right, front center, LFE, back/surround left, back/surround right
    7. channels: front left, front right, front center, LFE, back center, side left, side right
    8. channels: front left, front right, front center, LFE, back left, back right, side left, side right
  2. 1000 : left/side stereo: channel 0 is the left channel, channel 1 is the side(difference) channel
  3. 1001 : right/side stereo: channel 0 is the side(difference) channel, channel 1 is the right channel
  4. 1010 : mid/side stereo: channel 0 is the mid(average) channel, channel 1 is the side(difference) channel
  5. 1011-1111 : reserved
4 Bits
C 110 "110(b)" Sample size in bits:
  • 000 : get from STREAMINFO metadata block
  • 001 : 8 bits per sample
  • 010 : 12 bits per sample
  • 011 : reserved
  • 100 : 16 bits per sample
  • 101 : 20 bits per sample
  • 110 : 24 bits per sample
  • 111 : 32 bits per sample
3 Bits
0 "0(b)" Reserved: [1] Mandatory Value 0 1 Bit
F0 "11110000(b)" CRC-8 (polynomial = x^8 + x^2 + x^1 + x^0, initialized with 0) of everything before the crc, including the sync code 8 Bit
4EFF "0100111011111111(b)" CRC-16 (polynomial = x^16 + x^15 + x^2 + x^0, initialized with 0) of everything before the crc, back to and including the frame header sync code 16 Bit

Warm up Frames?

FF 89 81 FF 8E 74 FF 92 E9 FF 91 DF FF 95 46 FF 8E A2 FF 86 61 FF 7B 71 E6 9D E5

0 Stream Frame Sub-Header 2352

FF 7B 71 E6 9D E5

0 Stream Frame 2352
Value Hex Description Number Bits
FFF8 1111 1111 1111 10(b) FFF8 Sync code '11111111111110' 14 bits
0 "0(b)" Zero bit padding, to prevent sync-fooling string of 1s 1 Bit
0 "0(b)" Subframe type:
   000000 : SUBFRAME_CONSTANT
   000001 : SUBFRAME_VERBATIM
   00001x : reserved
   0001xx : reserved
   001xxx : if(xxx <= 4) SUBFRAME_FIXED, xxx=order ; else reserved
   01xxxx : reserved
   1xxxxx : SUBFRAME_LPC, xxxxx=order-1
6 Bit
C 1100 "1100(b)" Block size in inter-channel samples:
  • 0000 : reserved
  • 0001 : 192 samples
  • 0010-0101 : 576 * (2^(n-2)) samples, i.e. 576/1152/2304/4608
  • 0110 : get 8 bit (blocksize-1) from end of header
  • 0111 : get 16 bit (blocksize-1) from end of header
  • 1000-1111 : 256 * (2^(n-8)) samples, i.e. 256/512/1024/2048/4096/8192/16384/32768
4 Bits
3 0011 "0011(b)" Sample rate:
  • 0000 : get from STREAMINFO metadata block
  • 0001 : 88.2kHz
  • 0010 : 176.4kHz
  • 0011 : 192kHz
  • 0100 : 8kHz
  • 0101 : 16kHz
  • 0110 : 22.05kHz
  • 0111 : 24kHz
  • 1000 : 32kHz
  • 1001 : 44.1kHz
  • 1010 : 48kHz
  • 1011 : 96kHz
  • 1100 : get 8 bit sample rate (in kHz) from end of header
  • 1101 : get 16 bit sample rate (in Hz) from end of header
  • 1110 : get 16 bit sample rate (in tens of Hz) from end of header
  • 1111 : invalid, to prevent sync-fooling string of 1s
4 Bits
8 1000 "1000(b)" Channel assignment
  1. 0000-0111 : (number of independent channels)-1. Where defined, the channel order follows SMPTE/ITU-R recommendations. The assignments are as follows:
    1. channel: mono
    2. channels: left, right
    3. channels: left, right, center
    4. channels: front left, front right, back left, back right
    5. channels: front left, front right, front center, back/surround left, back/surround right
    6. channels: front left, front right, front center, LFE, back/surround left, back/surround right
    7. channels: front left, front right, front center, LFE, back center, side left, side right
    8. channels: front left, front right, front center, LFE, back left, back right, side left, side right
  2. 1000 : left/side stereo: channel 0 is the left channel, channel 1 is the side(difference) channel
  3. 1001 : right/side stereo: channel 0 is the side(difference) channel, channel 1 is the right channel
  4. 1010 : mid/side stereo: channel 0 is the mid(average) channel, channel 1 is the side(difference) channel
  5. 1011-1111 : reserved
4 Bits
C 110 "110(b)" Sample size in bits:
  • 000 : get from STREAMINFO metadata block
  • 001 : 8 bits per sample
  • 010 : 12 bits per sample
  • 011 : reserved
  • 100 : 16 bits per sample
  • 101 : 20 bits per sample
  • 110 : 24 bits per sample
  • 111 : 32 bits per sample
3 Bits
0 "0(b)" Reserved: [1] Mandatory Value 0 1 Bit
00 "00000000(b)" CRC-8 (polynomial = x^8 + x^2 + x^1 + x^0, initialized with 0) of everything before the crc, including the sync code 8 Bit
F04E "1111000001001110(b)" CRC-16 (polynomial = x^16 + x^15 + x^2 + x^0, initialized with 0) of everything before the crc, back to and including the frame header sync code 16 Bit

Manual Configure FLAC in Eclipse

  1. cmake project in Eclipse manual confiure. Johnny (talk) 19:16, 6 August 2024 (UTC)
  2. Follow full directions and do CMake first to populate directories.
  3. When updating make command include -C ${ConfigName} om behavior page.
  4. Debugging now.