1 /*****************************************************************************
2 * dts.c: parse DTS audio sync info and packetize the stream
3 *****************************************************************************
4 * Copyright (C) 2003-2009 the VideoLAN team
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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23 *****************************************************************************/
25 /*****************************************************************************
27 *****************************************************************************/
34 #include <vlc_common.h>
35 #include <vlc_plugin.h>
36 #include <vlc_codec.h>
38 #include <vlc_block_helper.h>
41 /*****************************************************************************
43 *****************************************************************************/
44 static int OpenDecoder ( vlc_object_t * );
45 static int OpenPacketizer( vlc_object_t * );
46 static void CloseCommon ( vlc_object_t * );
49 set_description( N_("DTS parser") )
50 set_capability( "decoder", 100 )
51 set_callbacks( OpenDecoder, CloseCommon )
54 set_description( N_("DTS audio packetizer") )
55 set_capability( "packetizer", 10 )
56 set_callbacks( OpenPacketizer, CloseCommon )
59 /*****************************************************************************
60 * decoder_sys_t : decoder descriptor
61 *****************************************************************************/
72 block_bytestream_t bytestream;
81 bool b_dts_hd; /* Is the current frame a DTS HD one */
82 unsigned int i_bit_rate;
83 unsigned int i_frame_size;
84 unsigned int i_frame_length;
86 unsigned int i_channels;
87 unsigned int i_channels_conf;
100 #define DTS_HEADER_SIZE 14
102 /****************************************************************************
104 ****************************************************************************/
105 static int OpenCommon( vlc_object_t *, bool b_packetizer );
106 static void *DecodeBlock( decoder_t *, block_t ** );
108 static inline int SyncCode( const uint8_t * );
109 static int SyncInfo( const uint8_t *, bool *, unsigned int *, unsigned int *,
110 unsigned int *, unsigned int *, unsigned int * );
112 static uint8_t *GetOutBuffer ( decoder_t *, void ** );
113 static aout_buffer_t *GetAoutBuffer( decoder_t * );
114 static block_t *GetSoutBuffer( decoder_t * );
116 /*****************************************************************************
117 * OpenDecoder: probe the decoder
118 *****************************************************************************/
119 static int OpenDecoder( vlc_object_t *p_this )
121 /* HACK: Don't use this codec if we don't have an dts audio filter */
122 if( !module_exists( "dtstofloat32" ) )
125 return OpenCommon( p_this, false );
128 /*****************************************************************************
129 * OpenPacketizer: probe the packetizer
130 *****************************************************************************/
131 static int OpenPacketizer( vlc_object_t *p_this )
133 return OpenCommon( p_this, true );
136 /*****************************************************************************
138 *****************************************************************************/
139 static int OpenCommon( vlc_object_t *p_this, bool b_packetizer )
141 decoder_t *p_dec = (decoder_t*)p_this;
142 decoder_sys_t *p_sys;
144 if( p_dec->fmt_in.i_codec != VLC_CODEC_DTS )
147 /* Allocate the memory needed to store the decoder's structure */
148 if( ( p_dec->p_sys = p_sys = malloc(sizeof(*p_sys)) ) == NULL )
152 p_sys->b_packetizer = b_packetizer;
153 p_sys->i_state = STATE_NOSYNC;
154 date_Set( &p_sys->end_date, 0 );
155 p_sys->b_dts_hd = false;
156 p_sys->i_pts = VLC_TS_INVALID;
158 p_sys->bytestream = block_BytestreamInit();
160 /* Set output properties */
161 p_dec->fmt_out.i_cat = AUDIO_ES;
162 p_dec->fmt_out.i_codec = VLC_CODEC_DTS;
163 p_dec->fmt_out.audio.i_rate = 0; /* So end_date gets initialized */
166 p_dec->pf_decode_audio = (aout_buffer_t *(*)(decoder_t *, block_t **))
168 p_dec->pf_packetize = (block_t *(*)(decoder_t *, block_t **))
174 /****************************************************************************
175 * DecodeBlock: the whole thing
176 ****************************************************************************/
177 static void *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
179 decoder_sys_t *p_sys = p_dec->p_sys;
180 uint8_t p_header[DTS_HEADER_SIZE];
184 if( !pp_block || !*pp_block )
187 if( (*pp_block)->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
189 if( (*pp_block)->i_flags&BLOCK_FLAG_CORRUPTED )
191 p_sys->i_state = STATE_NOSYNC;
192 block_BytestreamEmpty( &p_sys->bytestream );
194 date_Set( &p_sys->end_date, 0 );
195 block_Release( *pp_block );
199 if( !date_Get( &p_sys->end_date ) && (*pp_block)->i_pts <= VLC_TS_INVALID )
201 /* We've just started the stream, wait for the first PTS. */
202 block_Release( *pp_block );
206 block_BytestreamPush( &p_sys->bytestream, *pp_block );
210 switch( p_sys->i_state )
213 /* Look for sync code - should be 0x7ffe8001 */
214 while( block_PeekBytes( &p_sys->bytestream, p_header, 6 )
217 if( SyncCode( p_header ) == VLC_SUCCESS )
219 p_sys->i_state = STATE_SYNC;
222 block_SkipByte( &p_sys->bytestream );
224 if( p_sys->i_state != STATE_SYNC )
226 block_BytestreamFlush( &p_sys->bytestream );
233 /* New frame, set the Presentation Time Stamp */
234 p_sys->i_pts = p_sys->bytestream.p_block->i_pts;
235 if( p_sys->i_pts > VLC_TS_INVALID &&
236 p_sys->i_pts != date_Get( &p_sys->end_date ) )
238 date_Set( &p_sys->end_date, p_sys->i_pts );
240 p_sys->i_state = STATE_HEADER;
243 /* Get DTS frame header (DTS_HEADER_SIZE bytes) */
244 if( block_PeekBytes( &p_sys->bytestream, p_header,
245 DTS_HEADER_SIZE ) != VLC_SUCCESS )
251 /* Check if frame is valid and get frame info */
252 p_sys->i_frame_size = SyncInfo( p_header,
255 &p_sys->i_channels_conf,
258 &p_sys->i_frame_length );
259 if( !p_sys->i_frame_size )
261 msg_Dbg( p_dec, "emulated sync word" );
262 block_SkipByte( &p_sys->bytestream );
263 p_sys->i_state = STATE_NOSYNC;
266 p_sys->i_state = STATE_NEXT_SYNC;
268 case STATE_NEXT_SYNC:
269 /* TODO: If pp_block == NULL, flush the buffer without checking the
272 /* Check if next expected frame contains the sync word */
273 if( block_PeekOffsetBytes( &p_sys->bytestream,
274 p_sys->i_frame_size, p_header, 6 )
281 if( p_sys->b_packetizer &&
282 p_header[0] == 0 && p_header[1] == 0 )
284 /* DTS wav files and audio CD's use stuffing */
285 p_sys->i_state = STATE_SEND_DATA;
289 if( SyncCode( p_header ) != VLC_SUCCESS )
291 msg_Dbg( p_dec, "emulated sync word "
292 "(no sync on following frame): %2.2x%2.2x%2.2x%2.2x",
293 (int)p_header[0], (int)p_header[1],
294 (int)p_header[2], (int)p_header[3] );
295 p_sys->i_state = STATE_NOSYNC;
296 block_SkipByte( &p_sys->bytestream );
299 p_sys->i_state = STATE_SEND_DATA;
303 /* Make sure we have enough data.
304 * (Not useful if we went through NEXT_SYNC) */
305 if( block_WaitBytes( &p_sys->bytestream,
306 p_sys->i_frame_size ) != VLC_SUCCESS )
311 p_sys->i_state = STATE_SEND_DATA;
313 case STATE_SEND_DATA:
314 if( p_sys->b_dts_hd )
317 block_SkipBytes( &p_sys->bytestream, p_sys->i_frame_size );
318 p_sys->i_state = STATE_NOSYNC;
322 if( !(p_buf = GetOutBuffer( p_dec, &p_out_buffer )) )
324 //p_dec->b_error = true;
328 /* Copy the whole frame into the buffer. When we reach this point
329 * we already know we have enough data available. */
330 block_GetBytes( &p_sys->bytestream, p_buf, p_sys->i_frame_size );
332 /* Make sure we don't reuse the same pts twice */
333 if( p_sys->i_pts == p_sys->bytestream.p_block->i_pts )
334 p_sys->i_pts = p_sys->bytestream.p_block->i_pts = VLC_TS_INVALID;
336 p_sys->i_state = STATE_NOSYNC;
338 /* So p_block doesn't get re-added several times */
339 *pp_block = block_BytestreamPop( &p_sys->bytestream );
348 /*****************************************************************************
349 * CloseCommon: clean up the decoder
350 *****************************************************************************/
351 static void CloseCommon( vlc_object_t *p_this )
353 decoder_t *p_dec = (decoder_t*)p_this;
354 decoder_sys_t *p_sys = p_dec->p_sys;
356 block_BytestreamRelease( &p_sys->bytestream );
361 /*****************************************************************************
363 *****************************************************************************/
364 static uint8_t *GetOutBuffer( decoder_t *p_dec, void **pp_out_buffer )
366 decoder_sys_t *p_sys = p_dec->p_sys;
369 if( p_dec->fmt_out.audio.i_rate != p_sys->i_rate )
371 msg_Info( p_dec, "DTS channels:%d samplerate:%d bitrate:%d",
372 p_sys->i_channels, p_sys->i_rate, p_sys->i_bit_rate );
374 date_Init( &p_sys->end_date, p_sys->i_rate, 1 );
375 date_Set( &p_sys->end_date, p_sys->i_pts );
378 p_dec->fmt_out.audio.i_rate = p_sys->i_rate;
379 p_dec->fmt_out.audio.i_channels = p_sys->i_channels;
380 /* Hack for DTS S/PDIF filter which needs to pad the DTS frames */
381 p_dec->fmt_out.audio.i_bytes_per_frame =
382 __MAX( p_sys->i_frame_size, p_sys->i_frame_length * 4 );
383 p_dec->fmt_out.audio.i_frame_length = p_sys->i_frame_length;
385 p_dec->fmt_out.audio.i_original_channels = p_sys->i_channels_conf;
386 p_dec->fmt_out.audio.i_physical_channels =
387 p_sys->i_channels_conf & AOUT_CHAN_PHYSMASK;
389 p_dec->fmt_out.i_bitrate = p_sys->i_bit_rate;
391 if( p_sys->b_packetizer )
393 block_t *p_sout_buffer = GetSoutBuffer( p_dec );
394 p_buf = p_sout_buffer ? p_sout_buffer->p_buffer : NULL;
395 *pp_out_buffer = p_sout_buffer;
399 aout_buffer_t *p_aout_buffer = GetAoutBuffer( p_dec );
400 p_buf = p_aout_buffer ? p_aout_buffer->p_buffer : NULL;
401 *pp_out_buffer = p_aout_buffer;
407 /*****************************************************************************
409 *****************************************************************************/
410 static aout_buffer_t *GetAoutBuffer( decoder_t *p_dec )
412 decoder_sys_t *p_sys = p_dec->p_sys;
413 aout_buffer_t *p_buf;
415 /* Hack for DTS S/PDIF filter which needs to send 3 frames at a time
416 * (plus a few header bytes) */
417 p_buf = decoder_NewAudioBuffer( p_dec, p_sys->i_frame_length * 4 );
418 if( p_buf == NULL ) return NULL;
419 p_buf->i_nb_samples = p_sys->i_frame_length;
420 p_buf->i_buffer = p_sys->i_frame_size;
422 p_buf->i_pts = date_Get( &p_sys->end_date );
423 p_buf->i_length = date_Increment( &p_sys->end_date, p_sys->i_frame_length )
429 /*****************************************************************************
431 *****************************************************************************/
432 static block_t *GetSoutBuffer( decoder_t *p_dec )
434 decoder_sys_t *p_sys = p_dec->p_sys;
437 p_block = block_New( p_dec, p_sys->i_frame_size );
438 if( p_block == NULL ) return NULL;
440 p_block->i_pts = p_block->i_dts = date_Get( &p_sys->end_date );
442 p_block->i_length = date_Increment( &p_sys->end_date,
443 p_sys->i_frame_length ) - p_block->i_pts;
448 /*****************************************************************************
449 * SyncInfo: parse DTS sync info
450 *****************************************************************************/
451 static const unsigned int ppi_dts_samplerate[] =
453 0, 8000, 16000, 32000, 0, 0, 11025, 22050, 44100, 0, 0,
454 12000, 24000, 48000, 96000, 192000
457 static const unsigned int ppi_dts_bitrate[] =
459 32000, 56000, 64000, 96000, 112000, 128000,
460 192000, 224000, 256000, 320000, 384000,
461 448000, 512000, 576000, 640000, 768000,
462 896000, 1024000, 1152000, 1280000, 1344000,
463 1408000, 1411200, 1472000, 1536000, 1920000,
464 2048000, 3072000, 3840000, 1/*open*/, 2/*variable*/, 3/*lossless*/
467 static int SyncInfo16be( const uint8_t *p_buf,
468 unsigned int *pi_audio_mode,
469 unsigned int *pi_sample_rate,
470 unsigned int *pi_bit_rate,
471 unsigned int *pi_frame_length )
473 unsigned int i_frame_size;
476 *pi_frame_length = (p_buf[4] & 0x01) << 6 | (p_buf[5] >> 2);
477 i_frame_size = (p_buf[5] & 0x03) << 12 | (p_buf[6] << 4) |
480 *pi_audio_mode = (p_buf[7] & 0x0f) << 2 | (p_buf[8] >> 6);
481 *pi_sample_rate = (p_buf[8] >> 2) & 0x0f;
482 *pi_bit_rate = (p_buf[8] & 0x03) << 3 | ((p_buf[9] >> 5) & 0x07);
484 i_lfe = (p_buf[10] >> 1) & 0x03;
485 if( i_lfe ) *pi_audio_mode |= 0x10000;
487 return i_frame_size + 1;
490 static void BufLeToBe( uint8_t *p_out, const uint8_t *p_in, int i_in )
494 for( i = 0; i < i_in/2; i++ )
496 p_out[i*2] = p_in[i*2+1];
497 p_out[i*2+1] = p_in[i*2];
501 static int Buf14To16( uint8_t *p_out, const uint8_t *p_in, int i_in, int i_le )
503 unsigned char tmp, cur = 0;
504 int bits_in, bits_out = 0;
507 for( i = 0; i < i_in; i++ )
516 tmp = p_in[i+i_le] & 0x3F;
522 int need = __MIN( 8 - bits_out, bits_in );
524 cur |= ( tmp >> (bits_in - need) );
525 tmp <<= (8 - bits_in + need);
526 tmp >>= (8 - bits_in + need);
547 static inline int SyncCode( const uint8_t *p_buf )
549 /* 14 bits, little endian version of the bitstream */
550 if( p_buf[0] == 0xff && p_buf[1] == 0x1f &&
551 p_buf[2] == 0x00 && p_buf[3] == 0xe8 &&
552 (p_buf[4] & 0xf0) == 0xf0 && p_buf[5] == 0x07 )
556 /* 14 bits, big endian version of the bitstream */
557 else if( p_buf[0] == 0x1f && p_buf[1] == 0xff &&
558 p_buf[2] == 0xe8 && p_buf[3] == 0x00 &&
559 p_buf[4] == 0x07 && (p_buf[5] & 0xf0) == 0xf0 )
563 /* 16 bits, big endian version of the bitstream */
564 else if( p_buf[0] == 0x7f && p_buf[1] == 0xfe &&
565 p_buf[2] == 0x80 && p_buf[3] == 0x01 )
569 /* 16 bits, little endian version of the bitstream */
570 else if( p_buf[0] == 0xfe && p_buf[1] == 0x7f &&
571 p_buf[2] == 0x01 && p_buf[3] == 0x80 )
576 else if( p_buf[0] == 0x64 && p_buf[1] == 0x58 &&
577 p_buf[2] == 0x20 && p_buf[3] == 0x25 )
585 static int SyncInfo( const uint8_t *p_buf,
587 unsigned int *pi_channels,
588 unsigned int *pi_channels_conf,
589 unsigned int *pi_sample_rate,
590 unsigned int *pi_bit_rate,
591 unsigned int *pi_frame_length )
593 unsigned int i_audio_mode;
594 unsigned int i_frame_size;
596 /* 14 bits, little endian version of the bitstream */
597 if( p_buf[0] == 0xff && p_buf[1] == 0x1f &&
598 p_buf[2] == 0x00 && p_buf[3] == 0xe8 &&
599 (p_buf[4] & 0xf0) == 0xf0 && p_buf[5] == 0x07 )
601 uint8_t conv_buf[DTS_HEADER_SIZE];
602 Buf14To16( conv_buf, p_buf, DTS_HEADER_SIZE, 1 );
603 i_frame_size = SyncInfo16be( conv_buf, &i_audio_mode, pi_sample_rate,
604 pi_bit_rate, pi_frame_length );
605 i_frame_size = i_frame_size * 8 / 14 * 2;
607 /* 14 bits, big endian version of the bitstream */
608 else if( p_buf[0] == 0x1f && p_buf[1] == 0xff &&
609 p_buf[2] == 0xe8 && p_buf[3] == 0x00 &&
610 p_buf[4] == 0x07 && (p_buf[5] & 0xf0) == 0xf0 )
612 uint8_t conv_buf[DTS_HEADER_SIZE];
613 Buf14To16( conv_buf, p_buf, DTS_HEADER_SIZE, 0 );
614 i_frame_size = SyncInfo16be( conv_buf, &i_audio_mode, pi_sample_rate,
615 pi_bit_rate, pi_frame_length );
616 i_frame_size = i_frame_size * 8 / 14 * 2;
618 /* 16 bits, big endian version of the bitstream */
619 else if( p_buf[0] == 0x7f && p_buf[1] == 0xfe &&
620 p_buf[2] == 0x80 && p_buf[3] == 0x01 )
622 i_frame_size = SyncInfo16be( p_buf, &i_audio_mode, pi_sample_rate,
623 pi_bit_rate, pi_frame_length );
625 /* 16 bits, little endian version of the bitstream */
626 else if( p_buf[0] == 0xfe && p_buf[1] == 0x7f &&
627 p_buf[2] == 0x01 && p_buf[3] == 0x80 )
629 uint8_t conv_buf[DTS_HEADER_SIZE];
630 BufLeToBe( conv_buf, p_buf, DTS_HEADER_SIZE );
631 i_frame_size = SyncInfo16be( p_buf, &i_audio_mode, pi_sample_rate,
632 pi_bit_rate, pi_frame_length );
637 assert( p_buf[0] == 0x64 && p_buf[1] == 0x58 &&
638 p_buf[2] == 0x20 && p_buf[3] == 0x25 );
642 bs_init( &s, &p_buf[4], DTS_HEADER_SIZE - 4 );
644 bs_skip( &s, 8 + 2 );
649 i_dts_hd_size = bs_read( &s, 20 ) + 1;
654 i_dts_hd_size = bs_read( &s, 16 ) + 1;
656 //uint16_t s0 = bs_read( &s, 16 );
657 //uint16_t s1 = bs_read( &s, 16 );
658 //fprintf( stderr, "DTS HD=%d : %x %x\n", i_dts_hd_size, s0, s1 );
661 /* As we ignore the stream, do not modify those variables:
663 *pi_channels_conf = ;
668 return i_dts_hd_size;
673 switch( i_audio_mode & 0xFFFF )
678 *pi_channels_conf = AOUT_CHAN_CENTER;
681 /* Dual-mono = stereo + dual-mono */
683 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
691 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT;
696 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
702 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
703 AOUT_CHAN_REARCENTER;
708 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
709 AOUT_CHAN_CENTER | AOUT_CHAN_REARCENTER;
714 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
715 AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT;
720 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
721 AOUT_CHAN_CENTER | AOUT_CHAN_REARLEFT |
728 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
729 AOUT_CHAN_MIDDLELEFT | AOUT_CHAN_MIDDLERIGHT |
730 AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT;
735 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
736 AOUT_CHAN_CENTER | AOUT_CHAN_MIDDLELEFT |
737 AOUT_CHAN_MIDDLERIGHT | AOUT_CHAN_REARLEFT |
744 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
745 AOUT_CHAN_CENTER | AOUT_CHAN_MIDDLELEFT |
746 AOUT_CHAN_MIDDLERIGHT | AOUT_CHAN_REARLEFT |
747 AOUT_CHAN_REARRIGHT | AOUT_CHAN_LFE;
751 if( i_audio_mode <= 63 )
755 *pi_channels_conf = 0;
761 if( i_audio_mode & 0x10000 )
764 *pi_channels_conf |= AOUT_CHAN_LFE;
767 if( *pi_sample_rate >= sizeof( ppi_dts_samplerate ) /
768 sizeof( ppi_dts_samplerate[0] ) )
772 *pi_sample_rate = ppi_dts_samplerate[ *pi_sample_rate ];
773 if( !*pi_sample_rate ) return 0;
775 if( *pi_bit_rate >= sizeof( ppi_dts_bitrate ) /
776 sizeof( ppi_dts_bitrate[0] ) )
780 *pi_bit_rate = ppi_dts_bitrate[ *pi_bit_rate ];
781 if( !*pi_bit_rate ) return 0;
783 *pi_frame_length = (*pi_frame_length + 1) * 32;