1 /*****************************************************************************
2 * flac.c: flac packetizer module.
3 *****************************************************************************
4 * Copyright (C) 1999-2001 the VideoLAN team
7 * Authors: Gildas Bazin <gbazin@videolan.org>
8 * Sigmund Augdal Helberg <dnumgis@videolan.org>
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.
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.
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 *****************************************************************************/
25 /*****************************************************************************
27 *****************************************************************************/
33 #include <vlc_common.h>
34 #include <vlc_plugin.h>
35 #include <vlc_codec.h>
37 #include <vlc_block_helper.h>
40 /*****************************************************************************
42 *****************************************************************************/
43 static int Open ( vlc_object_t * );
44 static void Close( vlc_object_t * );
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 )
54 /*****************************************************************************
55 * decoder_sys_t : FLAC decoder descriptor
56 *****************************************************************************/
57 #define MAX_FLAC_HEADER_SIZE 16
65 block_bytestream_t bytestream;
72 unsigned min_blocksize, max_blocksize;
73 unsigned min_framesize, max_framesize;
76 unsigned bits_per_sample;
87 int i_frame_size, i_frame_length, i_bits_per_sample;
88 unsigned int i_rate, i_channels;
101 /*****************************************************************************
103 *****************************************************************************/
104 static block_t *Packetize( decoder_t *, block_t ** );
106 static int SyncInfo( decoder_t *, uint8_t *, unsigned int *,
107 unsigned int *,int * );
109 static uint64_t read_utf8( const uint8_t *p_buf, int *pi_read );
110 static uint8_t flac_crc8( const uint8_t *data, unsigned len );
112 static int Open( vlc_object_t *p_this )
114 decoder_t *p_dec = (decoder_t*)p_this;
115 decoder_sys_t *p_sys;
117 if( p_dec->fmt_in.i_codec != VLC_CODEC_FLAC )
121 p_dec->p_sys = p_sys = malloc(sizeof(*p_sys));
125 date_Set( &p_sys->end_date, 0 );
126 p_sys->i_state = STATE_NOSYNC;
127 p_sys->b_stream_info = false;
128 p_sys->i_pts = VLC_TS_INVALID;
129 p_sys->bytestream = block_BytestreamInit();
132 es_format_Copy( &p_dec->fmt_out, &p_dec->fmt_in );
133 p_dec->fmt_out.i_cat = AUDIO_ES;
134 p_dec->fmt_out.i_codec = VLC_CODEC_FLAC;
137 p_dec->pf_decode_audio = NULL;
138 p_dec->pf_packetize = Packetize;
143 static void Close( vlc_object_t *p_this )
145 decoder_t *p_dec = (decoder_t *)p_this;
146 decoder_sys_t *p_sys = p_dec->p_sys;
151 /*****************************************************************************
152 * ProcessHeader: process Flac header.
153 *****************************************************************************/
154 static void ProcessHeader( decoder_t *p_dec )
156 decoder_sys_t *p_sys = p_dec->p_sys;
160 if( !p_dec->fmt_in.i_extra )
163 bs_init( &bs, p_dec->fmt_in.p_extra, p_dec->fmt_in.i_extra );
165 p_sys->stream_info.min_blocksize = bs_read( &bs, 16 );
166 p_sys->stream_info.max_blocksize = bs_read( &bs, 16 );
168 p_sys->stream_info.min_framesize = bs_read( &bs, 24 );
169 p_sys->stream_info.max_framesize = bs_read( &bs, 24 );
171 p_sys->stream_info.sample_rate = bs_read( &bs, 20 );
172 p_sys->stream_info.channels = bs_read( &bs, 3 ) + 1;
173 p_sys->stream_info.bits_per_sample = bs_read( &bs, 5 ) + 1;
175 p_sys->b_stream_info = true;
177 p_dec->fmt_out.i_extra = p_dec->fmt_in.i_extra;
178 p_dec->fmt_out.p_extra = xrealloc( p_dec->fmt_out.p_extra,
179 p_dec->fmt_out.i_extra );
180 memcpy( p_dec->fmt_out.p_extra,
181 p_dec->fmt_in.p_extra, p_dec->fmt_out.i_extra );
185 static block_t *Packetize( decoder_t *p_dec, block_t **pp_block )
187 decoder_sys_t *p_sys = p_dec->p_sys;
188 uint8_t p_header[MAX_FLAC_HEADER_SIZE];
189 block_t *p_sout_block;
191 if( !pp_block || !*pp_block ) return NULL;
193 if( (*pp_block)->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
195 if( (*pp_block)->i_flags&BLOCK_FLAG_CORRUPTED )
197 p_sys->i_state = STATE_NOSYNC;
198 block_BytestreamEmpty( &p_sys->bytestream );
200 date_Set( &p_sys->end_date, 0 );
201 block_Release( *pp_block );
205 if( !p_sys->b_stream_info )
206 ProcessHeader( p_dec );
208 if( p_sys->stream_info.channels > 6 )
210 msg_Err( p_dec, "This stream uses too many audio channels" );
214 if( !date_Get( &p_sys->end_date ) && (*pp_block)->i_pts <= VLC_TS_INVALID )
216 /* We've just started the stream, wait for the first PTS. */
217 block_Release( *pp_block );
220 else if( !date_Get( &p_sys->end_date ) )
222 /* The first PTS is as good as anything else. */
223 p_sys->i_rate = p_dec->fmt_out.audio.i_rate;
224 date_Init( &p_sys->end_date, p_sys->i_rate, 1 );
225 date_Set( &p_sys->end_date, (*pp_block)->i_pts );
228 block_BytestreamPush( &p_sys->bytestream, *pp_block );
232 switch( p_sys->i_state )
235 while( block_PeekBytes( &p_sys->bytestream, p_header, 2 )
238 if( p_header[0] == 0xFF && p_header[1] == 0xF8 )
240 p_sys->i_state = STATE_SYNC;
243 block_SkipByte( &p_sys->bytestream );
245 if( p_sys->i_state != STATE_SYNC )
247 block_BytestreamFlush( &p_sys->bytestream );
254 /* New frame, set the Presentation Time Stamp */
255 p_sys->i_pts = p_sys->bytestream.p_block->i_pts;
256 if( p_sys->i_pts > VLC_TS_INVALID &&
257 p_sys->i_pts != date_Get( &p_sys->end_date ) )
259 date_Set( &p_sys->end_date, p_sys->i_pts );
261 p_sys->i_state = STATE_HEADER;
264 /* Get FLAC frame header (MAX_FLAC_HEADER_SIZE bytes) */
265 if( block_PeekBytes( &p_sys->bytestream, p_header,
266 MAX_FLAC_HEADER_SIZE ) != VLC_SUCCESS )
272 /* Check if frame is valid and get frame info */
273 p_sys->i_frame_length = SyncInfo( p_dec, p_header,
276 &p_sys->i_bits_per_sample );
277 if( !p_sys->i_frame_length )
279 msg_Dbg( p_dec, "emulated sync word" );
280 block_SkipByte( &p_sys->bytestream );
281 p_sys->i_state = STATE_NOSYNC;
284 if( p_sys->i_rate != p_dec->fmt_out.audio.i_rate )
286 p_dec->fmt_out.audio.i_rate = p_sys->i_rate;
287 date_Init( &p_sys->end_date, p_sys->i_rate, 1 );
288 date_Set( &p_sys->end_date, p_sys->i_pts );
290 p_sys->i_state = STATE_NEXT_SYNC;
291 p_sys->i_frame_size = 1;
293 case STATE_NEXT_SYNC:
294 /* TODO: If pp_block == NULL, flush the buffer without checking the
297 /* Check if next expected frame contains the sync word */
298 while( block_PeekOffsetBytes( &p_sys->bytestream,
299 p_sys->i_frame_size, p_header,
300 MAX_FLAC_HEADER_SIZE )
303 if( p_header[0] == 0xFF && p_header[1] == 0xF8 )
305 /* Check if frame is valid and get frame info */
307 SyncInfo( p_dec, p_header,
310 &p_sys->i_bits_per_sample );
314 p_sys->i_state = STATE_SEND_DATA;
318 p_sys->i_frame_size++;
321 if( p_sys->i_state != STATE_SEND_DATA )
327 case STATE_SEND_DATA:
328 p_sout_block = block_New( p_dec, p_sys->i_frame_size );
330 /* Copy the whole frame into the buffer. When we reach this point
331 * we already know we have enough data available. */
332 block_GetBytes( &p_sys->bytestream, p_sout_block->p_buffer,
333 p_sys->i_frame_size );
335 /* Make sure we don't reuse the same pts twice */
336 if( p_sys->i_pts == p_sys->bytestream.p_block->i_pts )
337 p_sys->i_pts = p_sys->bytestream.p_block->i_pts = VLC_TS_INVALID;
339 /* So p_block doesn't get re-added several times */
340 *pp_block = block_BytestreamPop( &p_sys->bytestream );
342 p_sys->i_state = STATE_NOSYNC;
344 /* Date management */
345 p_sout_block->i_pts =
346 p_sout_block->i_dts = date_Get( &p_sys->end_date );
347 date_Increment( &p_sys->end_date, p_sys->i_frame_length );
348 p_sout_block->i_length =
349 date_Get( &p_sys->end_date ) - p_sout_block->i_pts;
358 /*****************************************************************************
359 * SyncInfo: parse FLAC sync info
360 *****************************************************************************/
361 static int SyncInfo( decoder_t *p_dec, uint8_t *p_buf,
362 unsigned int * pi_channels,
363 unsigned int * pi_sample_rate,
364 int * pi_bits_per_sample )
366 decoder_sys_t *p_sys = p_dec->p_sys;
367 int i_header, i_temp, i_read;
368 unsigned i_blocksize = 0;
369 int i_blocksize_hint = 0, i_sample_rate_hint = 0;
370 uint64_t i_sample_number = 0;
372 bool b_variable_blocksize = ( p_sys->b_stream_info &&
373 p_sys->stream_info.min_blocksize != p_sys->stream_info.max_blocksize );
374 bool b_fixed_blocksize = ( p_sys->b_stream_info &&
375 p_sys->stream_info.min_blocksize == p_sys->stream_info.max_blocksize );
378 if( p_buf[0] != 0xFF || p_buf[1] != 0xF8 ) return 0;
380 /* Check there is no emulated sync code in the rest of the header */
381 if( p_buf[2] == 0xff || p_buf[3] == 0xFF ) return 0;
383 /* Find blocksize (framelength) */
384 switch( i_temp = p_buf[2] >> 4 )
387 if( b_fixed_blocksize )
388 i_blocksize = p_sys->stream_info.min_blocksize;
389 else return 0; /* We can't do anything with this */
400 i_blocksize = 576 << (i_temp - 2);
405 i_blocksize_hint = i_temp;
416 i_blocksize = 256 << (i_temp - 8);
420 /* Find samplerate */
421 switch( i_temp = p_buf[2] & 0x0f )
424 if( p_sys->b_stream_info )
425 *pi_sample_rate = p_sys->stream_info.sample_rate;
426 else return 0; /* We can't do anything with this */
430 *pi_sample_rate = 88200;
434 *pi_sample_rate = 176400;
438 *pi_sample_rate = 192000;
442 *pi_sample_rate = 8000;
446 *pi_sample_rate = 16000;
450 *pi_sample_rate = 22050;
454 *pi_sample_rate = 24000;
458 *pi_sample_rate = 32000;
462 *pi_sample_rate = 44100;
466 *pi_sample_rate = 48000;
470 *pi_sample_rate = 96000;
476 i_sample_rate_hint = i_temp;
484 i_temp = (unsigned)(p_buf[3] >> 4);
487 if( ( i_temp & 7 ) >= 3 )
493 *pi_channels = i_temp + 1;
496 /* Find bits per sample */
497 switch( i_temp = (unsigned)(p_buf[3] & 0x0e) >> 1 )
500 if( p_sys->b_stream_info )
501 *pi_bits_per_sample = p_sys->stream_info.bits_per_sample;
507 *pi_bits_per_sample = 8;
511 *pi_bits_per_sample = 12;
515 *pi_bits_per_sample = 16;
519 *pi_bits_per_sample = 20;
523 *pi_bits_per_sample = 24;
532 /* Zero padding bit */
533 if( p_buf[3] & 0x01 ) return 0;
535 /* End of fixed size header */
538 /* Find Sample/Frame number */
539 if( i_blocksize_hint && b_variable_blocksize )
541 i_sample_number = read_utf8( &p_buf[i_header++], &i_read );
542 if( i_sample_number == INT64_C(0xffffffffffffffff) ) return 0;
546 i_sample_number = read_utf8( &p_buf[i_header++], &i_read );
547 if( i_sample_number == INT64_C(0xffffffffffffffff) ) return 0;
549 if( p_sys->b_stream_info )
550 i_sample_number *= p_sys->stream_info.min_blocksize;
556 if( i_blocksize_hint )
558 int i_val1 = p_buf[i_header++];
559 if( i_blocksize_hint == 7 )
561 int i_val2 = p_buf[i_header++];
562 i_val1 = (i_val1 << 8) | i_val2;
564 i_blocksize = i_val1 + 1;
567 /* Read sample rate */
568 if( i_sample_rate_hint )
570 int i_val1 = p_buf[i_header++];
571 if( i_sample_rate_hint != 12 )
573 int i_val2 = p_buf[i_header++];
574 i_val1 = (i_val1 << 8) | i_val2;
576 if( i_sample_rate_hint == 12 ) *pi_sample_rate = i_val1 * 1000;
577 else if( i_sample_rate_hint == 13 ) *pi_sample_rate = i_val1;
578 else *pi_sample_rate = i_val1 * 10;
581 /* Check the CRC-8 byte */
582 if( flac_crc8( p_buf, i_header ) != p_buf[i_header] )
587 /* Sanity check using stream info header when possible */
588 if( p_sys->b_stream_info )
590 if( i_blocksize < p_sys->stream_info.min_blocksize ||
591 i_blocksize > p_sys->stream_info.max_blocksize )
597 /* Will return 0xffffffffffffffff for an invalid utf-8 sequence */
598 static uint64_t read_utf8( const uint8_t *p_buf, int *pi_read )
600 uint64_t i_result = 0;
603 if( !(p_buf[0] & 0x80) ) /* 0xxxxxxx */
608 else if( p_buf[0] & 0xC0 && !(p_buf[0] & 0x20) ) /* 110xxxxx */
610 i_result = p_buf[0] & 0x1F;
613 else if( p_buf[0] & 0xE0 && !(p_buf[0] & 0x10) ) /* 1110xxxx */
615 i_result = p_buf[0] & 0x0F;
618 else if( p_buf[0] & 0xF0 && !(p_buf[0] & 0x08) ) /* 11110xxx */
620 i_result = p_buf[0] & 0x07;
623 else if( p_buf[0] & 0xF8 && !(p_buf[0] & 0x04) ) /* 111110xx */
625 i_result = p_buf[0] & 0x03;
628 else if( p_buf[0] & 0xFC && !(p_buf[0] & 0x02) ) /* 1111110x */
630 i_result = p_buf[0] & 0x01;
633 else if( p_buf[0] & 0xFE && !(p_buf[0] & 0x01) ) /* 11111110 */
639 return INT64_C(0xffffffffffffffff);
642 for( j = 1; j <= i; j++ )
644 if( !(p_buf[j] & 0x80) || (p_buf[j] & 0x40) ) /* 10xxxxxx */
646 return INT64_C(0xffffffffffffffff);
649 i_result |= (p_buf[j] & 0x3F);
656 /* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */
657 static const uint8_t flac_crc8_table[256] = {
658 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,
659 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
660 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,
661 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,
662 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,
663 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,
664 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85,
665 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,
666 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2,
667 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,
668 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2,
669 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,
670 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,
671 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,
672 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,
673 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,
674 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C,
675 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,
676 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC,
677 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,
678 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,
679 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,
680 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C,
681 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
682 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B,
683 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,
684 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B,
685 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,
686 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB,
687 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,
688 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB,
689 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3
692 static uint8_t flac_crc8( const uint8_t *data, unsigned len )
697 crc = flac_crc8_table[crc ^ *data++];