]> git.sesse.net Git - vlc/blob - modules/packetizer/flac.c
Added a check against block size in FLAC packetizer.
[vlc] / modules / packetizer / flac.c
1 /*****************************************************************************
2  * flac.c: flac packetizer module.
3  *****************************************************************************
4  * Copyright (C) 1999-2001 the VideoLAN team
5  * $Id$
6  *
7  * Authors: Gildas Bazin <gbazin@videolan.org>
8  *          Sigmund Augdal Helberg <dnumgis@videolan.org>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23  *****************************************************************************/
24
25 /*****************************************************************************
26  * Preamble
27  *****************************************************************************/
28
29 #ifdef HAVE_CONFIG_H
30 # include "config.h"
31 #endif
32
33 #include <vlc_common.h>
34 #include <vlc_plugin.h>
35 #include <vlc_codec.h>
36
37 #include <vlc_block_helper.h>
38 #include <vlc_bits.h>
39
40 /*****************************************************************************
41  * Module descriptor
42  *****************************************************************************/
43 static int  Open ( vlc_object_t * );
44 static void Close( vlc_object_t * );
45
46 vlc_module_begin()
47     set_category( CAT_SOUT )
48     set_subcategory( SUBCAT_SOUT_PACKETIZER )
49     set_description( N_("Flac audio packetizer") )
50     set_capability( "packetizer", 50 )
51     set_callbacks( Open, Close )
52 vlc_module_end()
53
54 /*****************************************************************************
55  * decoder_sys_t : FLAC decoder descriptor
56  *****************************************************************************/
57 #define MAX_FLAC_HEADER_SIZE 16
58 struct decoder_sys_t
59 {
60     /*
61      * Input properties
62      */
63     int i_state;
64
65     block_bytestream_t bytestream;
66
67     /*
68      * FLAC properties
69      */
70     struct
71     {
72         unsigned min_blocksize, max_blocksize;
73         unsigned min_framesize, max_framesize;
74         unsigned sample_rate;
75         unsigned channels;
76         unsigned bits_per_sample;
77
78     } stream_info;
79     bool b_stream_info;
80
81     /*
82      * Common properties
83      */
84     date_t  end_date;
85     mtime_t i_pts;
86
87     int i_frame_length;
88     size_t i_frame_size;
89     unsigned int i_rate, i_channels, i_bits_per_sample;
90 };
91
92 enum
93 {
94     STATE_NOSYNC,
95     STATE_SYNC,
96     STATE_HEADER,
97     STATE_NEXT_SYNC,
98     STATE_GET_DATA,
99     STATE_SEND_DATA
100 };
101
102 /*****************************************************************************
103  * Local prototypes
104  *****************************************************************************/
105 static block_t *Packetize( decoder_t *, block_t ** );
106
107 static int SyncInfo( decoder_t *, uint8_t *, unsigned int *,
108                      unsigned int *, unsigned int * );
109
110 static uint64_t read_utf8( const uint8_t *p_buf, int *pi_read );
111 static uint8_t flac_crc8( const uint8_t *data, unsigned len );
112
113 static int Open( vlc_object_t *p_this )
114 {
115     decoder_t *p_dec = (decoder_t*)p_this;
116     decoder_sys_t *p_sys;
117
118     if( p_dec->fmt_in.i_codec != VLC_CODEC_FLAC )
119         return VLC_EGENERIC;
120
121     /* */
122     p_dec->p_sys = p_sys = malloc(sizeof(*p_sys));
123     if( !p_sys )
124         return VLC_ENOMEM;
125
126     date_Set( &p_sys->end_date, 0 );
127     p_sys->i_state       = STATE_NOSYNC;
128     p_sys->b_stream_info = false;
129     p_sys->i_pts         = VLC_TS_INVALID;
130     p_sys->bytestream    = block_BytestreamInit();
131
132     /* */
133     es_format_Copy( &p_dec->fmt_out, &p_dec->fmt_in );
134     p_dec->fmt_out.i_cat   = AUDIO_ES;
135     p_dec->fmt_out.i_codec = VLC_CODEC_FLAC;
136
137     /* */
138     p_dec->pf_decode_audio = NULL;
139     p_dec->pf_packetize    = Packetize;
140
141     return VLC_SUCCESS;
142 }
143
144 static void Close( vlc_object_t *p_this )
145 {
146     decoder_t *p_dec = (decoder_t *)p_this;
147     decoder_sys_t *p_sys = p_dec->p_sys;
148
149     block_BytestreamRelease( &p_sys->bytestream );
150     free( p_sys );
151 }
152
153 /*****************************************************************************
154  * ProcessHeader: process Flac header.
155  *****************************************************************************/
156 static void ProcessHeader( decoder_t *p_dec )
157 {
158     decoder_sys_t *p_sys = p_dec->p_sys;
159
160     bs_t bs;
161
162     if( p_dec->fmt_in.i_extra < 8 + 14 )
163         return;
164
165     bs_init( &bs, (uint8_t*)p_dec->fmt_in.p_extra + 8, p_dec->fmt_in.i_extra - 8 );
166
167     p_sys->stream_info.min_blocksize = bs_read( &bs, 16 );
168     p_sys->stream_info.max_blocksize = bs_read( &bs, 16 );
169
170     p_sys->stream_info.min_framesize = bs_read( &bs, 24 );
171     p_sys->stream_info.max_framesize = bs_read( &bs, 24 );
172
173     p_sys->stream_info.sample_rate = bs_read( &bs, 20 );
174     p_sys->stream_info.channels = bs_read( &bs, 3 ) + 1;
175     p_sys->stream_info.bits_per_sample = bs_read( &bs, 5 ) + 1;
176
177     p_sys->b_stream_info = true;
178
179     p_dec->fmt_out.i_extra = p_dec->fmt_in.i_extra;
180     p_dec->fmt_out.p_extra = xrealloc( p_dec->fmt_out.p_extra,
181                                        p_dec->fmt_out.i_extra );
182     memcpy( p_dec->fmt_out.p_extra,
183             p_dec->fmt_in.p_extra, p_dec->fmt_out.i_extra );
184 }
185
186 /* */
187 static block_t *Packetize( decoder_t *p_dec, block_t **pp_block )
188 {
189     decoder_sys_t *p_sys = p_dec->p_sys;
190     uint8_t p_header[MAX_FLAC_HEADER_SIZE];
191     block_t *p_sout_block;
192
193     if( !pp_block || !*pp_block ) return NULL;
194
195     if( (*pp_block)->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
196     {
197         if( (*pp_block)->i_flags&BLOCK_FLAG_CORRUPTED )
198         {
199             p_sys->i_state = STATE_NOSYNC;
200             block_BytestreamEmpty( &p_sys->bytestream );
201         }
202         date_Set( &p_sys->end_date, 0 );
203         block_Release( *pp_block );
204         return NULL;
205     }
206
207     if( !p_sys->b_stream_info )
208         ProcessHeader( p_dec );
209
210     if( p_sys->stream_info.channels > 8 )
211     {
212         msg_Err( p_dec, "This stream uses too many audio channels" );
213         return NULL;
214     }
215
216     if( !date_Get( &p_sys->end_date ) && (*pp_block)->i_pts <= VLC_TS_INVALID )
217     {
218         /* We've just started the stream, wait for the first PTS. */
219         block_Release( *pp_block );
220         return NULL;
221     }
222     else if( !date_Get( &p_sys->end_date ) )
223     {
224         /* The first PTS is as good as anything else. */
225         p_sys->i_rate = p_dec->fmt_out.audio.i_rate;
226         date_Init( &p_sys->end_date, p_sys->i_rate, 1 );
227         date_Set( &p_sys->end_date, (*pp_block)->i_pts );
228     }
229
230     block_BytestreamPush( &p_sys->bytestream, *pp_block );
231
232     while( 1 )
233     {
234         switch( p_sys->i_state )
235         {
236         case STATE_NOSYNC:
237             while( block_PeekBytes( &p_sys->bytestream, p_header, 2 )
238                    == VLC_SUCCESS )
239             {
240                 if( p_header[0] == 0xFF && (p_header[1] & 0xFE) == 0xF8 )
241                 {
242                     p_sys->i_state = STATE_SYNC;
243                     break;
244                 }
245                 block_SkipByte( &p_sys->bytestream );
246             }
247             if( p_sys->i_state != STATE_SYNC )
248             {
249                 block_BytestreamFlush( &p_sys->bytestream );
250
251                 /* Need more data */
252                 return NULL;
253             }
254
255         case STATE_SYNC:
256             /* New frame, set the Presentation Time Stamp */
257             p_sys->i_pts = p_sys->bytestream.p_block->i_pts;
258             if( p_sys->i_pts > VLC_TS_INVALID &&
259                 p_sys->i_pts != date_Get( &p_sys->end_date ) )
260             {
261                 date_Set( &p_sys->end_date, p_sys->i_pts );
262             }
263             p_sys->i_state = STATE_HEADER;
264
265         case STATE_HEADER:
266             /* Get FLAC frame header (MAX_FLAC_HEADER_SIZE bytes) */
267             if( block_PeekBytes( &p_sys->bytestream, p_header,
268                                  MAX_FLAC_HEADER_SIZE ) != VLC_SUCCESS )
269             {
270                 /* Need more data */
271                 return NULL;
272             }
273
274             /* Check if frame is valid and get frame info */
275             p_sys->i_frame_length = SyncInfo( p_dec, p_header,
276                                               &p_sys->i_channels,
277                                               &p_sys->i_rate,
278                                               &p_sys->i_bits_per_sample );
279             if( !p_sys->i_frame_length )
280             {
281                 msg_Dbg( p_dec, "emulated sync word" );
282                 block_SkipByte( &p_sys->bytestream );
283                 p_sys->i_state = STATE_NOSYNC;
284                 break;
285             }
286             if( p_sys->i_rate != p_dec->fmt_out.audio.i_rate )
287             {
288                 p_dec->fmt_out.audio.i_rate = p_sys->i_rate;
289                 const mtime_t i_end_date = date_Get( &p_sys->end_date );
290                 date_Init( &p_sys->end_date, p_sys->i_rate, 1 );
291                 date_Set( &p_sys->end_date, i_end_date );
292             }
293             p_sys->i_state = STATE_NEXT_SYNC;
294             p_sys->i_frame_size = p_sys->b_stream_info && p_sys->stream_info.min_framesize > 0 ?
295                                                             p_sys->stream_info.min_framesize : 1;
296
297         case STATE_NEXT_SYNC:
298             /* TODO: If pp_block == NULL, flush the buffer without checking the
299              * next sync word */
300
301             /* Check if next expected frame contains the sync word */
302             while( block_PeekOffsetBytes( &p_sys->bytestream,
303                                           p_sys->i_frame_size, p_header,
304                                           MAX_FLAC_HEADER_SIZE )
305                    == VLC_SUCCESS )
306             {
307                 if( p_header[0] == 0xFF && (p_header[1] & 0xFE) == 0xF8 )
308                 {
309                     /* Check if frame is valid and get frame info */
310                     int i_frame_length =
311                         SyncInfo( p_dec, p_header,
312                                   &p_sys->i_channels,
313                                   &p_sys->i_rate,
314                                   &p_sys->i_bits_per_sample );
315
316                     if( i_frame_length )
317                     {
318                         p_sys->i_state = STATE_SEND_DATA;
319                         break;
320                     }
321                 }
322                 p_sys->i_frame_size++;
323             }
324
325             if( p_sys->i_state != STATE_SEND_DATA )
326             {
327                 if( p_sys->b_stream_info && p_sys->stream_info.max_framesize > 0 &&
328                     p_sys->i_frame_size > p_sys->stream_info.max_framesize )
329                 {
330                     block_SkipByte( &p_sys->bytestream );
331                     p_sys->i_state = STATE_NOSYNC;
332                     return NULL;
333                 }
334                 /* Need more data */
335                 return NULL;
336             }
337
338         case STATE_SEND_DATA:
339             p_sout_block = block_New( p_dec, p_sys->i_frame_size );
340
341             /* Copy the whole frame into the buffer. When we reach this point
342              * we already know we have enough data available. */
343             block_GetBytes( &p_sys->bytestream, p_sout_block->p_buffer,
344                             p_sys->i_frame_size );
345
346             /* Make sure we don't reuse the same pts twice */
347             if( p_sys->i_pts == p_sys->bytestream.p_block->i_pts )
348                 p_sys->i_pts = p_sys->bytestream.p_block->i_pts = VLC_TS_INVALID;
349
350             /* So p_block doesn't get re-added several times */
351             *pp_block = block_BytestreamPop( &p_sys->bytestream );
352
353             p_sys->i_state = STATE_NOSYNC;
354
355             /* Date management */
356             p_sout_block->i_pts =
357                 p_sout_block->i_dts = date_Get( &p_sys->end_date );
358             date_Increment( &p_sys->end_date, p_sys->i_frame_length );
359             p_sout_block->i_length =
360                 date_Get( &p_sys->end_date ) - p_sout_block->i_pts;
361
362             return p_sout_block;
363         }
364     }
365
366     return NULL;
367 }
368
369 /*****************************************************************************
370  * SyncInfo: parse FLAC sync info
371  *****************************************************************************/
372 static int SyncInfo( decoder_t *p_dec, uint8_t *p_buf,
373                      unsigned int * pi_channels,
374                      unsigned int * pi_sample_rate,
375                      unsigned int * pi_bits_per_sample )
376 {
377     decoder_sys_t *p_sys = p_dec->p_sys;
378     int i_header, i_temp, i_read;
379     unsigned i_blocksize = 0;
380     int i_blocksize_hint = 0, i_sample_rate_hint = 0;
381
382     /* Check syncword */
383     if( p_buf[0] != 0xFF || (p_buf[1] & 0xFE) != 0xF8 ) return 0;
384
385     /* Check there is no emulated sync code in the rest of the header */
386     if( p_buf[2] == 0xff || p_buf[3] == 0xFF ) return 0;
387
388     /* Find blocksize (framelength) */
389     switch( i_temp = p_buf[2] >> 4 )
390     {
391     case 0:
392         if( p_sys->b_stream_info &&
393             p_sys->stream_info.min_blocksize == p_sys->stream_info.max_blocksize )
394             i_blocksize = p_sys->stream_info.min_blocksize;
395         else return 0; /* We can't do anything with this */
396         break;
397
398     case 1:
399         i_blocksize = 192;
400         break;
401
402     case 2:
403     case 3:
404     case 4:
405     case 5:
406         i_blocksize = 576 << (i_temp - 2);
407         break;
408
409     case 6:
410     case 7:
411         i_blocksize_hint = i_temp;
412         break;
413
414     case 8:
415     case 9:
416     case 10:
417     case 11:
418     case 12:
419     case 13:
420     case 14:
421     case 15:
422         i_blocksize = 256 << (i_temp - 8);
423         break;
424     }
425     if( p_sys->b_stream_info &&
426         ( i_blocksize < p_sys->stream_info.min_blocksize ||
427           i_blocksize > p_sys->stream_info.max_blocksize ) )
428         return 0;
429
430     /* Find samplerate */
431     switch( i_temp = p_buf[2] & 0x0f )
432     {
433     case 0:
434         if( p_sys->b_stream_info )
435             *pi_sample_rate = p_sys->stream_info.sample_rate;
436         else return 0; /* We can't do anything with this */
437         break;
438
439     case 1:
440         *pi_sample_rate = 88200;
441         break;
442
443     case 2:
444         *pi_sample_rate = 176400;
445         break;
446
447     case 3:
448         *pi_sample_rate = 192000;
449         break;
450
451     case 4:
452         *pi_sample_rate = 8000;
453         break;
454
455     case 5:
456         *pi_sample_rate = 16000;
457         break;
458
459     case 6:
460         *pi_sample_rate = 22050;
461         break;
462
463     case 7:
464         *pi_sample_rate = 24000;
465         break;
466
467     case 8:
468         *pi_sample_rate = 32000;
469         break;
470
471     case 9:
472         *pi_sample_rate = 44100;
473         break;
474
475     case 10:
476         *pi_sample_rate = 48000;
477         break;
478
479     case 11:
480         *pi_sample_rate = 96000;
481         break;
482
483     case 12:
484     case 13:
485     case 14:
486         i_sample_rate_hint = i_temp;
487         break;
488
489     case 15:
490         return 0;
491     }
492
493     /* Find channels */
494     i_temp = (unsigned)(p_buf[3] >> 4);
495     if( i_temp & 8 )
496     {
497         if( ( i_temp & 7 ) >= 3 )
498             return 0;
499         *pi_channels = 2;
500     }
501     else
502     {
503         *pi_channels = i_temp + 1;
504     }
505
506     /* Find bits per sample */
507     switch( i_temp = (unsigned)(p_buf[3] & 0x0e) >> 1 )
508     {
509     case 0:
510         if( p_sys->b_stream_info )
511             *pi_bits_per_sample = p_sys->stream_info.bits_per_sample;
512         else
513             return 0;
514         break;
515
516     case 1:
517         *pi_bits_per_sample = 8;
518         break;
519
520     case 2:
521         *pi_bits_per_sample = 12;
522         break;
523
524     case 4:
525         *pi_bits_per_sample = 16;
526         break;
527
528     case 5:
529         *pi_bits_per_sample = 20;
530         break;
531
532     case 6:
533         *pi_bits_per_sample = 24;
534         break;
535
536     case 3:
537     case 7:
538         return 0;
539         break;
540     }
541
542     /* Zero padding bit */
543     if( p_buf[3] & 0x01 ) return 0;
544
545     /* End of fixed size header */
546     i_header = 4;
547
548     /* Check Sample/Frame number */
549     if( read_utf8( &p_buf[i_header++], &i_read ) == INT64_C(0xffffffffffffffff) )
550         return 0;
551
552     i_header += i_read;
553
554     /* Read blocksize */
555     if( i_blocksize_hint )
556     {
557         int i_val1 = p_buf[i_header++];
558         if( i_blocksize_hint == 7 )
559         {
560             int i_val2 = p_buf[i_header++];
561             i_val1 = (i_val1 << 8) | i_val2;
562         }
563         i_blocksize = i_val1 + 1;
564     }
565
566     /* Read sample rate */
567     if( i_sample_rate_hint )
568     {
569         int i_val1 = p_buf[i_header++];
570         if( i_sample_rate_hint != 12 )
571         {
572             int i_val2 = p_buf[i_header++];
573             i_val1 = (i_val1 << 8) | i_val2;
574         }
575         if( i_sample_rate_hint == 12 ) *pi_sample_rate = i_val1 * 1000;
576         else if( i_sample_rate_hint == 13 ) *pi_sample_rate = i_val1;
577         else *pi_sample_rate = i_val1 * 10;
578     }
579
580     /* Check the CRC-8 byte */
581     if( flac_crc8( p_buf, i_header ) != p_buf[i_header] )
582     {
583         return 0;
584     }
585
586     /* Sanity check using stream info header when possible */
587     if( p_sys->b_stream_info )
588     {
589         if( i_blocksize < p_sys->stream_info.min_blocksize ||
590             i_blocksize > p_sys->stream_info.max_blocksize )
591             return 0;
592         if( *pi_bits_per_sample != p_sys->stream_info.bits_per_sample )
593             return 0;
594         if( *pi_sample_rate != p_sys->stream_info.sample_rate )
595             return 0;
596     }
597     return i_blocksize;
598 }
599
600 /* Will return 0xffffffffffffffff for an invalid utf-8 sequence */
601 static uint64_t read_utf8( const uint8_t *p_buf, int *pi_read )
602 {
603     uint64_t i_result = 0;
604     unsigned i, j;
605
606     if( !(p_buf[0] & 0x80) ) /* 0xxxxxxx */
607     {
608         i_result = p_buf[0];
609         i = 0;
610     }
611     else if( p_buf[0] & 0xC0 && !(p_buf[0] & 0x20) ) /* 110xxxxx */
612     {
613         i_result = p_buf[0] & 0x1F;
614         i = 1;
615     }
616     else if( p_buf[0] & 0xE0 && !(p_buf[0] & 0x10) ) /* 1110xxxx */
617     {
618         i_result = p_buf[0] & 0x0F;
619         i = 2;
620     }
621     else if( p_buf[0] & 0xF0 && !(p_buf[0] & 0x08) ) /* 11110xxx */
622     {
623         i_result = p_buf[0] & 0x07;
624         i = 3;
625     }
626     else if( p_buf[0] & 0xF8 && !(p_buf[0] & 0x04) ) /* 111110xx */
627     {
628         i_result = p_buf[0] & 0x03;
629         i = 4;
630     }
631     else if( p_buf[0] & 0xFC && !(p_buf[0] & 0x02) ) /* 1111110x */
632     {
633         i_result = p_buf[0] & 0x01;
634         i = 5;
635     }
636     else if( p_buf[0] & 0xFE && !(p_buf[0] & 0x01) ) /* 11111110 */
637     {
638         i_result = 0;
639         i = 6;
640     }
641     else {
642         return INT64_C(0xffffffffffffffff);
643     }
644
645     for( j = 1; j <= i; j++ )
646     {
647         if( !(p_buf[j] & 0x80) || (p_buf[j] & 0x40) ) /* 10xxxxxx */
648         {
649             return INT64_C(0xffffffffffffffff);
650         }
651         i_result <<= 6;
652         i_result |= (p_buf[j] & 0x3F);
653     }
654
655     *pi_read = i;
656     return i_result;
657 }
658
659 /* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */
660 static const uint8_t flac_crc8_table[256] = {
661         0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,
662         0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
663         0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,
664         0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,
665         0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,
666         0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,
667         0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85,
668         0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,
669         0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2,
670         0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,
671         0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2,
672         0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,
673         0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,
674         0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,
675         0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,
676         0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,
677         0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C,
678         0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,
679         0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC,
680         0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,
681         0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,
682         0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,
683         0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C,
684         0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
685         0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B,
686         0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,
687         0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B,
688         0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,
689         0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB,
690         0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,
691         0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB,
692         0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3
693 };
694
695 static uint8_t flac_crc8( const uint8_t *data, unsigned len )
696 {
697     uint8_t crc = 0;
698
699     while(len--)
700         crc = flac_crc8_table[crc ^ *data++];
701
702     return crc;
703 }
704