1 /*****************************************************************************
2 * dts.c: parse DTS audio sync info and packetize the stream
3 *****************************************************************************
4 * Copyright (C) 2003 VideoLAN
7 * Authors: Jon Lech Johansen <jon-vl@nanocrew.net>
8 * Gildas Bazin <gbazin@netcourrier.com>
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., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
23 *****************************************************************************/
25 /*****************************************************************************
27 *****************************************************************************/
29 #include <vlc/decoder.h>
31 #include "vlc_block_helper.h"
33 #define DTS_HEADER_SIZE 14
35 /*****************************************************************************
36 * decoder_sys_t : decoder descriptor
37 *****************************************************************************/
41 vlc_bool_t b_packetizer;
48 block_bytestream_t bytestream;
53 audio_date_t end_date;
57 int i_frame_size, i_bit_rate;
58 unsigned int i_frame_length, i_rate, i_channels, i_channels_conf;
71 /****************************************************************************
73 ****************************************************************************/
74 static int OpenDecoder ( vlc_object_t * );
75 static int OpenPacketizer( vlc_object_t * );
76 static void CloseDecoder ( vlc_object_t * );
77 static void *DecodeBlock ( decoder_t *, block_t ** );
79 static inline int SyncCode( const uint8_t * );
80 static int SyncInfo ( const uint8_t *, unsigned int *, unsigned int *,
81 unsigned int *, unsigned int *, unsigned int * );
83 static uint8_t *GetOutBuffer ( decoder_t *, void ** );
84 static aout_buffer_t *GetAoutBuffer( decoder_t * );
85 static block_t *GetSoutBuffer( decoder_t * );
87 /*****************************************************************************
89 *****************************************************************************/
91 set_description( _("DTS parser") );
92 set_capability( "decoder", 100 );
93 set_category( CAT_INPUT );
94 set_subcategory( SUBCAT_INPUT_ACODEC );
95 set_callbacks( OpenDecoder, CloseDecoder );
98 set_description( _("DTS audio packetizer") );
99 set_capability( "packetizer", 10 );
100 set_callbacks( OpenPacketizer, NULL );
103 /*****************************************************************************
104 * OpenDecoder: probe the decoder and return score
105 *****************************************************************************/
106 static int OpenDecoder( vlc_object_t *p_this )
108 decoder_t *p_dec = (decoder_t*)p_this;
109 decoder_sys_t *p_sys;
111 if( p_dec->fmt_in.i_codec != VLC_FOURCC('d','t','s',' ')
112 && p_dec->fmt_in.i_codec != VLC_FOURCC('d','t','s','b') )
117 /* Allocate the memory needed to store the decoder's structure */
118 if( ( p_dec->p_sys = p_sys =
119 (decoder_sys_t *)malloc(sizeof(decoder_sys_t)) ) == NULL )
121 msg_Err( p_dec, "out of memory" );
126 p_sys->b_packetizer = VLC_FALSE;
127 p_sys->i_state = STATE_NOSYNC;
128 aout_DateSet( &p_sys->end_date, 0 );
130 p_sys->bytestream = block_BytestreamInit( p_dec );
132 /* Set output properties */
133 p_dec->fmt_out.i_cat = AUDIO_ES;
134 p_dec->fmt_out.i_codec = VLC_FOURCC('d','t','s',' ');
135 p_dec->fmt_out.audio.i_rate = 0; /* So end_date gets initialized */
138 p_dec->pf_decode_audio = (aout_buffer_t *(*)(decoder_t *, block_t **))
140 p_dec->pf_packetize = (block_t *(*)(decoder_t *, block_t **))
146 static int OpenPacketizer( vlc_object_t *p_this )
148 decoder_t *p_dec = (decoder_t*)p_this;
150 int i_ret = OpenDecoder( p_this );
152 if( i_ret == VLC_SUCCESS ) p_dec->p_sys->b_packetizer = VLC_TRUE;
157 /****************************************************************************
158 * DecodeBlock: the whole thing
159 ****************************************************************************
160 * This function is called just after the thread is launched.
161 ****************************************************************************/
162 static void *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
164 decoder_sys_t *p_sys = p_dec->p_sys;
165 uint8_t p_header[DTS_HEADER_SIZE];
169 if( !pp_block || !*pp_block ) return NULL;
171 if( !aout_DateGet( &p_sys->end_date ) && !(*pp_block)->i_pts )
173 /* We've just started the stream, wait for the first PTS. */
174 block_Release( *pp_block );
178 if( (*pp_block)->i_flags&BLOCK_FLAG_DISCONTINUITY )
180 p_sys->i_state = STATE_NOSYNC;
183 block_BytestreamPush( &p_sys->bytestream, *pp_block );
187 switch( p_sys->i_state )
190 /* Look for sync code - should be 0x7ffe8001 */
191 while( block_PeekBytes( &p_sys->bytestream, p_header, 6 )
194 if( SyncCode( p_header ) == VLC_SUCCESS )
196 p_sys->i_state = STATE_SYNC;
199 block_SkipByte( &p_sys->bytestream );
201 if( p_sys->i_state != STATE_SYNC )
203 block_BytestreamFlush( &p_sys->bytestream );
210 /* New frame, set the Presentation Time Stamp */
211 p_sys->i_pts = p_sys->bytestream.p_block->i_pts;
212 if( p_sys->i_pts != 0 &&
213 p_sys->i_pts != aout_DateGet( &p_sys->end_date ) )
215 aout_DateSet( &p_sys->end_date, p_sys->i_pts );
217 p_sys->i_state = STATE_HEADER;
220 /* Get DTS frame header (DTS_HEADER_SIZE bytes) */
221 if( block_PeekBytes( &p_sys->bytestream, p_header,
222 DTS_HEADER_SIZE ) != VLC_SUCCESS )
228 /* Check if frame is valid and get frame info */
229 p_sys->i_frame_size = SyncInfo( p_header,
231 &p_sys->i_channels_conf,
234 &p_sys->i_frame_length );
235 if( !p_sys->i_frame_size )
237 msg_Dbg( p_dec, "emulated sync word" );
238 block_SkipByte( &p_sys->bytestream );
239 p_sys->i_state = STATE_NOSYNC;
242 p_sys->i_state = STATE_NEXT_SYNC;
244 case STATE_NEXT_SYNC:
245 /* TODO: If pp_block == NULL, flush the buffer without checking the
248 /* Check if next expected frame contains the sync word */
249 if( block_PeekOffsetBytes( &p_sys->bytestream,
250 p_sys->i_frame_size, p_header, 6 )
257 if( SyncCode( p_header ) != VLC_SUCCESS )
259 msg_Dbg( p_dec, "emulated sync word "
260 "(no sync on following frame): %2.2x%2.2x%2.2x%2.2x",
261 (int)p_header[0], (int)p_header[1],
262 (int)p_header[2], (int)p_header[3] );
263 p_sys->i_state = STATE_NOSYNC;
264 block_SkipByte( &p_sys->bytestream );
267 p_sys->i_state = STATE_SEND_DATA;
271 /* Make sure we have enough data.
272 * (Not useful if we went through NEXT_SYNC) */
273 if( block_WaitBytes( &p_sys->bytestream,
274 p_sys->i_frame_size ) != VLC_SUCCESS )
279 p_sys->i_state = STATE_SEND_DATA;
281 case STATE_SEND_DATA:
282 if( !(p_buf = GetOutBuffer( p_dec, &p_out_buffer )) )
284 //p_dec->b_error = VLC_TRUE;
288 /* Copy the whole frame into the buffer. When we reach this point
289 * we already know we have enough data available. */
290 block_GetBytes( &p_sys->bytestream, p_buf, p_sys->i_frame_size );
292 /* Make sure we don't reuse the same pts twice */
293 if( p_sys->i_pts == p_sys->bytestream.p_block->i_pts )
294 p_sys->i_pts = p_sys->bytestream.p_block->i_pts = 0;
296 p_sys->i_state = STATE_NOSYNC;
298 /* So p_block doesn't get re-added several times */
299 *pp_block = block_BytestreamPop( &p_sys->bytestream );
308 /*****************************************************************************
309 * CloseDecoder: clean up the decoder
310 *****************************************************************************/
311 static void CloseDecoder( vlc_object_t *p_this )
313 decoder_t *p_dec = (decoder_t*)p_this;
314 decoder_sys_t *p_sys = p_dec->p_sys;
316 block_BytestreamRelease( &p_sys->bytestream );
321 /*****************************************************************************
323 *****************************************************************************/
324 static uint8_t *GetOutBuffer( decoder_t *p_dec, void **pp_out_buffer )
326 decoder_sys_t *p_sys = p_dec->p_sys;
329 if( p_dec->fmt_out.audio.i_rate != p_sys->i_rate )
331 msg_Info( p_dec, "DTS channels:%d samplerate:%d bitrate:%d",
332 p_sys->i_channels, p_sys->i_rate, p_sys->i_bit_rate );
334 aout_DateInit( &p_sys->end_date, p_sys->i_rate );
335 aout_DateSet( &p_sys->end_date, p_sys->i_pts );
338 p_dec->fmt_out.audio.i_rate = p_sys->i_rate;
339 p_dec->fmt_out.audio.i_channels = p_sys->i_channels;
340 /* Hack for DTS S/PDIF filter which needs to pad the DTS frames */
341 p_dec->fmt_out.audio.i_bytes_per_frame =
342 __MAX( p_sys->i_frame_size, p_sys->i_frame_length * 4 );
343 p_dec->fmt_out.audio.i_frame_length = p_sys->i_frame_length;
345 p_dec->fmt_out.audio.i_original_channels = p_sys->i_channels_conf;
346 p_dec->fmt_out.audio.i_physical_channels =
347 p_sys->i_channels_conf & AOUT_CHAN_PHYSMASK;
349 p_dec->fmt_out.i_bitrate = p_sys->i_bit_rate;
351 if( p_sys->b_packetizer )
353 block_t *p_sout_buffer = GetSoutBuffer( p_dec );
354 p_buf = p_sout_buffer ? p_sout_buffer->p_buffer : NULL;
355 *pp_out_buffer = p_sout_buffer;
359 aout_buffer_t *p_aout_buffer = GetAoutBuffer( p_dec );
360 p_buf = p_aout_buffer ? p_aout_buffer->p_buffer : NULL;
361 *pp_out_buffer = p_aout_buffer;
367 /*****************************************************************************
369 *****************************************************************************/
370 static aout_buffer_t *GetAoutBuffer( decoder_t *p_dec )
372 decoder_sys_t *p_sys = p_dec->p_sys;
373 aout_buffer_t *p_buf;
375 /* Hack for DTS S/PDIF filter which needs to send 3 frames at a time
376 * (plus a few header bytes) */
377 p_buf = p_dec->pf_aout_buffer_new( p_dec, p_sys->i_frame_length * 4 );
378 if( p_buf == NULL ) return NULL;
379 p_buf->i_nb_samples = p_sys->i_frame_length;
380 p_buf->i_nb_bytes = p_sys->i_frame_size;
382 p_buf->start_date = aout_DateGet( &p_sys->end_date );
384 aout_DateIncrement( &p_sys->end_date, p_sys->i_frame_length );
389 /*****************************************************************************
391 *****************************************************************************/
392 static block_t *GetSoutBuffer( decoder_t *p_dec )
394 decoder_sys_t *p_sys = p_dec->p_sys;
397 p_block = block_New( p_dec, p_sys->i_frame_size );
398 if( p_block == NULL ) return NULL;
400 p_block->i_pts = p_block->i_dts = aout_DateGet( &p_sys->end_date );
402 p_block->i_length = aout_DateIncrement( &p_sys->end_date,
403 p_sys->i_frame_length ) - p_block->i_pts;
408 /*****************************************************************************
409 * SyncInfo: parse DTS sync info
410 *****************************************************************************/
411 static const unsigned int ppi_dts_samplerate[] =
413 0, 8000, 16000, 32000, 0, 0, 11025, 22050, 44100, 0, 0,
414 12000, 24000, 48000, 96000, 192000
417 static const unsigned int ppi_dts_bitrate[] =
419 32000, 56000, 64000, 96000, 112000, 128000,
420 192000, 224000, 256000, 320000, 384000,
421 448000, 512000, 576000, 640000, 768000,
422 896000, 1024000, 1152000, 1280000, 1344000,
423 1408000, 1411200, 1472000, 1536000, 1920000,
424 2048000, 3072000, 3840000, 1/*open*/, 2/*variable*/, 3/*lossless*/
427 static int SyncInfo16be( const uint8_t *p_buf,
428 unsigned int *pi_audio_mode,
429 unsigned int *pi_sample_rate,
430 unsigned int *pi_bit_rate,
431 unsigned int *pi_frame_length )
433 unsigned int i_frame_size;
436 *pi_frame_length = (p_buf[4] & 0x01) << 6 | (p_buf[5] >> 2);
437 i_frame_size = (p_buf[5] & 0x03) << 12 | (p_buf[6] << 4) |
440 *pi_audio_mode = (p_buf[7] & 0x0f) << 2 | (p_buf[8] >> 6);
441 *pi_sample_rate = (p_buf[8] >> 2) & 0x0f;
442 *pi_bit_rate = (p_buf[8] & 0x03) << 3 | ((p_buf[9] >> 5) & 0x07);
444 i_lfe = (p_buf[10] >> 1) & 0x03;
445 if( i_lfe ) *pi_audio_mode |= 0x10000;
447 return i_frame_size + 1;
450 static void BufLeToBe( uint8_t *p_out, const uint8_t *p_in, int i_in )
454 for( i = 0; i < i_in/2; i++ )
456 p_out[i*2] = p_in[i*2+1];
457 p_out[i*2+1] = p_in[i*2];
461 static int Buf14To16( uint8_t *p_out, const uint8_t *p_in, int i_in, int i_le )
463 unsigned char tmp, cur = 0;
464 int bits_in, bits_out = 0;
467 for( i = 0; i < i_in; i++ )
476 tmp = p_in[i+i_le] & 0x3F;
482 int need = __MIN( 8 - bits_out, bits_in );
484 cur |= ( tmp >> (bits_in - need) );
485 tmp <<= (8 - bits_in + need);
486 tmp >>= (8 - bits_in + need);
507 static inline int SyncCode( const uint8_t *p_buf )
509 /* 14 bits, little endian version of the bitstream */
510 if( p_buf[0] == 0xff && p_buf[1] == 0x1f &&
511 p_buf[2] == 0x00 && p_buf[3] == 0xe8 &&
512 (p_buf[4] & 0xf0) == 0xf0 && p_buf[5] == 0x07 )
516 /* 14 bits, big endian version of the bitstream */
517 else if( p_buf[0] == 0x1f && p_buf[1] == 0xff &&
518 p_buf[2] == 0xe8 && p_buf[3] == 0x00 &&
519 p_buf[4] == 0x07 && (p_buf[5] & 0xf0) == 0xf0 )
523 /* 16 bits, big endian version of the bitstream */
524 else if( p_buf[0] == 0x7f && p_buf[1] == 0xfe &&
525 p_buf[2] == 0x80 && p_buf[3] == 0x01 )
529 /* 16 bits, little endian version of the bitstream */
530 else if( p_buf[0] == 0xfe && p_buf[1] == 0x7f &&
531 p_buf[2] == 0x01 && p_buf[3] == 0x80 )
535 else return VLC_EGENERIC;
538 static int SyncInfo( const uint8_t *p_buf,
539 unsigned int *pi_channels,
540 unsigned int *pi_channels_conf,
541 unsigned int *pi_sample_rate,
542 unsigned int *pi_bit_rate,
543 unsigned int *pi_frame_length )
545 unsigned int i_audio_mode;
546 unsigned int i_frame_size;
548 /* 14 bits, little endian version of the bitstream */
549 if( p_buf[0] == 0xff && p_buf[1] == 0x1f &&
550 p_buf[2] == 0x00 && p_buf[3] == 0xe8 &&
551 (p_buf[4] & 0xf0) == 0xf0 && p_buf[5] == 0x07 )
553 uint8_t conv_buf[DTS_HEADER_SIZE];
554 Buf14To16( conv_buf, p_buf, DTS_HEADER_SIZE, 1 );
555 i_frame_size = SyncInfo16be( conv_buf, &i_audio_mode, pi_sample_rate,
556 pi_bit_rate, pi_frame_length );
557 i_frame_size = i_frame_size * 8 / 14 * 2;
559 /* 14 bits, big endian version of the bitstream */
560 else if( p_buf[0] == 0x1f && p_buf[1] == 0xff &&
561 p_buf[2] == 0xe8 && p_buf[3] == 0x00 &&
562 p_buf[4] == 0x07 && (p_buf[5] & 0xf0) == 0xf0 )
564 uint8_t conv_buf[DTS_HEADER_SIZE];
565 Buf14To16( conv_buf, p_buf, DTS_HEADER_SIZE, 0 );
566 i_frame_size = SyncInfo16be( conv_buf, &i_audio_mode, pi_sample_rate,
567 pi_bit_rate, pi_frame_length );
568 i_frame_size = i_frame_size * 8 / 14 * 2;
570 /* 16 bits, big endian version of the bitstream */
571 else if( p_buf[0] == 0x7f && p_buf[1] == 0xfe &&
572 p_buf[2] == 0x80 && p_buf[3] == 0x01 )
574 i_frame_size = SyncInfo16be( p_buf, &i_audio_mode, pi_sample_rate,
575 pi_bit_rate, pi_frame_length );
577 /* 16 bits, little endian version of the bitstream */
578 else if( p_buf[0] == 0xfe && p_buf[1] == 0x7f &&
579 p_buf[2] == 0x01 && p_buf[3] == 0x80 )
581 uint8_t conv_buf[DTS_HEADER_SIZE];
582 BufLeToBe( conv_buf, p_buf, DTS_HEADER_SIZE );
583 i_frame_size = SyncInfo16be( p_buf, &i_audio_mode, pi_sample_rate,
584 pi_bit_rate, pi_frame_length );
588 switch( i_audio_mode & 0xFFFF )
592 *pi_channels_conf = AOUT_CHAN_CENTER;
595 /* Dual-mono = stereo + dual-mono */
596 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
604 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT;
609 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
615 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
616 AOUT_CHAN_REARCENTER;
621 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
622 AOUT_CHAN_CENTER | AOUT_CHAN_REARCENTER;
627 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
628 AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT;
633 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
634 AOUT_CHAN_CENTER | AOUT_CHAN_REARLEFT |
641 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
642 AOUT_CHAN_MIDDLELEFT | AOUT_CHAN_MIDDLERIGHT |
643 AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT;
648 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
649 AOUT_CHAN_CENTER | AOUT_CHAN_MIDDLELEFT |
650 AOUT_CHAN_MIDDLERIGHT | AOUT_CHAN_REARLEFT |
657 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
658 AOUT_CHAN_CENTER | AOUT_CHAN_MIDDLELEFT |
659 AOUT_CHAN_MIDDLERIGHT | AOUT_CHAN_REARLEFT |
660 AOUT_CHAN_REARRIGHT | AOUT_CHAN_LFE;
664 if( i_audio_mode <= 63 )
668 *pi_channels_conf = 0;
674 if( i_audio_mode & 0x10000 )
677 *pi_channels_conf |= AOUT_CHAN_LFE;
680 if( *pi_sample_rate >= sizeof( ppi_dts_samplerate ) /
681 sizeof( ppi_dts_samplerate[0] ) )
685 *pi_sample_rate = ppi_dts_samplerate[ *pi_sample_rate ];
686 if( !*pi_sample_rate ) return 0;
688 if( *pi_bit_rate >= sizeof( ppi_dts_bitrate ) /
689 sizeof( ppi_dts_bitrate[0] ) )
693 *pi_bit_rate = ppi_dts_bitrate[ *pi_bit_rate ];
694 if( !*pi_bit_rate ) return 0;
696 *pi_frame_length = (*pi_frame_length + 1) * 32;