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;
157 p_sys->bytestream = block_BytestreamInit();
159 /* Set output properties */
160 p_dec->fmt_out.i_cat = AUDIO_ES;
161 p_dec->fmt_out.i_codec = VLC_CODEC_DTS;
162 p_dec->fmt_out.audio.i_rate = 0; /* So end_date gets initialized */
165 p_dec->pf_decode_audio = (aout_buffer_t *(*)(decoder_t *, block_t **))
167 p_dec->pf_packetize = (block_t *(*)(decoder_t *, block_t **))
173 /****************************************************************************
174 * DecodeBlock: the whole thing
175 ****************************************************************************/
176 static void *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
178 decoder_sys_t *p_sys = p_dec->p_sys;
179 uint8_t p_header[DTS_HEADER_SIZE];
183 if( !pp_block || !*pp_block )
186 if( (*pp_block)->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
188 if( (*pp_block)->i_flags&BLOCK_FLAG_CORRUPTED )
190 p_sys->i_state = STATE_NOSYNC;
191 block_BytestreamEmpty( &p_sys->bytestream );
193 date_Set( &p_sys->end_date, 0 );
194 block_Release( *pp_block );
198 if( !date_Get( &p_sys->end_date ) && !(*pp_block)->i_pts )
200 /* We've just started the stream, wait for the first PTS. */
201 block_Release( *pp_block );
205 block_BytestreamPush( &p_sys->bytestream, *pp_block );
209 switch( p_sys->i_state )
212 /* Look for sync code - should be 0x7ffe8001 */
213 while( block_PeekBytes( &p_sys->bytestream, p_header, 6 )
216 if( SyncCode( p_header ) == VLC_SUCCESS )
218 p_sys->i_state = STATE_SYNC;
221 block_SkipByte( &p_sys->bytestream );
223 if( p_sys->i_state != STATE_SYNC )
225 block_BytestreamFlush( &p_sys->bytestream );
232 /* New frame, set the Presentation Time Stamp */
233 p_sys->i_pts = p_sys->bytestream.p_block->i_pts;
234 if( p_sys->i_pts != 0 &&
235 p_sys->i_pts != date_Get( &p_sys->end_date ) )
237 date_Set( &p_sys->end_date, p_sys->i_pts );
239 p_sys->i_state = STATE_HEADER;
242 /* Get DTS frame header (DTS_HEADER_SIZE bytes) */
243 if( block_PeekBytes( &p_sys->bytestream, p_header,
244 DTS_HEADER_SIZE ) != VLC_SUCCESS )
250 /* Check if frame is valid and get frame info */
251 p_sys->i_frame_size = SyncInfo( p_header,
254 &p_sys->i_channels_conf,
257 &p_sys->i_frame_length );
258 if( !p_sys->i_frame_size )
260 msg_Dbg( p_dec, "emulated sync word" );
261 block_SkipByte( &p_sys->bytestream );
262 p_sys->i_state = STATE_NOSYNC;
265 p_sys->i_state = STATE_NEXT_SYNC;
267 case STATE_NEXT_SYNC:
268 /* TODO: If pp_block == NULL, flush the buffer without checking the
271 /* Check if next expected frame contains the sync word */
272 if( block_PeekOffsetBytes( &p_sys->bytestream,
273 p_sys->i_frame_size, p_header, 6 )
280 if( SyncCode( p_header ) != VLC_SUCCESS )
282 msg_Dbg( p_dec, "emulated sync word "
283 "(no sync on following frame): %2.2x%2.2x%2.2x%2.2x",
284 (int)p_header[0], (int)p_header[1],
285 (int)p_header[2], (int)p_header[3] );
286 p_sys->i_state = STATE_NOSYNC;
287 block_SkipByte( &p_sys->bytestream );
290 p_sys->i_state = STATE_SEND_DATA;
294 /* Make sure we have enough data.
295 * (Not useful if we went through NEXT_SYNC) */
296 if( block_WaitBytes( &p_sys->bytestream,
297 p_sys->i_frame_size ) != VLC_SUCCESS )
302 p_sys->i_state = STATE_SEND_DATA;
304 case STATE_SEND_DATA:
305 if( p_sys->b_dts_hd )
308 block_SkipBytes( &p_sys->bytestream, p_sys->i_frame_size );
309 p_sys->i_state = STATE_NOSYNC;
313 if( !(p_buf = GetOutBuffer( p_dec, &p_out_buffer )) )
315 //p_dec->b_error = true;
319 /* Copy the whole frame into the buffer. When we reach this point
320 * we already know we have enough data available. */
321 block_GetBytes( &p_sys->bytestream, p_buf, p_sys->i_frame_size );
323 /* Make sure we don't reuse the same pts twice */
324 if( p_sys->i_pts == p_sys->bytestream.p_block->i_pts )
325 p_sys->i_pts = p_sys->bytestream.p_block->i_pts = 0;
327 p_sys->i_state = STATE_NOSYNC;
329 /* So p_block doesn't get re-added several times */
330 *pp_block = block_BytestreamPop( &p_sys->bytestream );
339 /*****************************************************************************
340 * CloseCommon: clean up the decoder
341 *****************************************************************************/
342 static void CloseCommon( vlc_object_t *p_this )
344 decoder_t *p_dec = (decoder_t*)p_this;
345 decoder_sys_t *p_sys = p_dec->p_sys;
347 block_BytestreamRelease( &p_sys->bytestream );
352 /*****************************************************************************
354 *****************************************************************************/
355 static uint8_t *GetOutBuffer( decoder_t *p_dec, void **pp_out_buffer )
357 decoder_sys_t *p_sys = p_dec->p_sys;
360 if( p_dec->fmt_out.audio.i_rate != p_sys->i_rate )
362 msg_Info( p_dec, "DTS channels:%d samplerate:%d bitrate:%d",
363 p_sys->i_channels, p_sys->i_rate, p_sys->i_bit_rate );
365 date_Init( &p_sys->end_date, p_sys->i_rate, 1 );
366 date_Set( &p_sys->end_date, p_sys->i_pts );
369 p_dec->fmt_out.audio.i_rate = p_sys->i_rate;
370 p_dec->fmt_out.audio.i_channels = p_sys->i_channels;
371 /* Hack for DTS S/PDIF filter which needs to pad the DTS frames */
372 p_dec->fmt_out.audio.i_bytes_per_frame =
373 __MAX( p_sys->i_frame_size, p_sys->i_frame_length * 4 );
374 p_dec->fmt_out.audio.i_frame_length = p_sys->i_frame_length;
376 p_dec->fmt_out.audio.i_original_channels = p_sys->i_channels_conf;
377 p_dec->fmt_out.audio.i_physical_channels =
378 p_sys->i_channels_conf & AOUT_CHAN_PHYSMASK;
380 p_dec->fmt_out.i_bitrate = p_sys->i_bit_rate;
382 if( p_sys->b_packetizer )
384 block_t *p_sout_buffer = GetSoutBuffer( p_dec );
385 p_buf = p_sout_buffer ? p_sout_buffer->p_buffer : NULL;
386 *pp_out_buffer = p_sout_buffer;
390 aout_buffer_t *p_aout_buffer = GetAoutBuffer( p_dec );
391 p_buf = p_aout_buffer ? p_aout_buffer->p_buffer : NULL;
392 *pp_out_buffer = p_aout_buffer;
398 /*****************************************************************************
400 *****************************************************************************/
401 static aout_buffer_t *GetAoutBuffer( decoder_t *p_dec )
403 decoder_sys_t *p_sys = p_dec->p_sys;
404 aout_buffer_t *p_buf;
406 /* Hack for DTS S/PDIF filter which needs to send 3 frames at a time
407 * (plus a few header bytes) */
408 p_buf = decoder_NewAudioBuffer( p_dec, p_sys->i_frame_length * 4 );
409 if( p_buf == NULL ) return NULL;
410 p_buf->i_nb_samples = p_sys->i_frame_length;
411 p_buf->i_buffer = p_sys->i_frame_size;
413 p_buf->i_pts = date_Get( &p_sys->end_date );
414 p_buf->i_length = date_Increment( &p_sys->end_date, p_sys->i_frame_length )
420 /*****************************************************************************
422 *****************************************************************************/
423 static block_t *GetSoutBuffer( decoder_t *p_dec )
425 decoder_sys_t *p_sys = p_dec->p_sys;
428 p_block = block_New( p_dec, p_sys->i_frame_size );
429 if( p_block == NULL ) return NULL;
431 p_block->i_pts = p_block->i_dts = date_Get( &p_sys->end_date );
433 p_block->i_length = date_Increment( &p_sys->end_date,
434 p_sys->i_frame_length ) - p_block->i_pts;
439 /*****************************************************************************
440 * SyncInfo: parse DTS sync info
441 *****************************************************************************/
442 static const unsigned int ppi_dts_samplerate[] =
444 0, 8000, 16000, 32000, 0, 0, 11025, 22050, 44100, 0, 0,
445 12000, 24000, 48000, 96000, 192000
448 static const unsigned int ppi_dts_bitrate[] =
450 32000, 56000, 64000, 96000, 112000, 128000,
451 192000, 224000, 256000, 320000, 384000,
452 448000, 512000, 576000, 640000, 768000,
453 896000, 1024000, 1152000, 1280000, 1344000,
454 1408000, 1411200, 1472000, 1536000, 1920000,
455 2048000, 3072000, 3840000, 1/*open*/, 2/*variable*/, 3/*lossless*/
458 static int SyncInfo16be( const uint8_t *p_buf,
459 unsigned int *pi_audio_mode,
460 unsigned int *pi_sample_rate,
461 unsigned int *pi_bit_rate,
462 unsigned int *pi_frame_length )
464 unsigned int i_frame_size;
467 *pi_frame_length = (p_buf[4] & 0x01) << 6 | (p_buf[5] >> 2);
468 i_frame_size = (p_buf[5] & 0x03) << 12 | (p_buf[6] << 4) |
471 *pi_audio_mode = (p_buf[7] & 0x0f) << 2 | (p_buf[8] >> 6);
472 *pi_sample_rate = (p_buf[8] >> 2) & 0x0f;
473 *pi_bit_rate = (p_buf[8] & 0x03) << 3 | ((p_buf[9] >> 5) & 0x07);
475 i_lfe = (p_buf[10] >> 1) & 0x03;
476 if( i_lfe ) *pi_audio_mode |= 0x10000;
478 return i_frame_size + 1;
481 static void BufLeToBe( uint8_t *p_out, const uint8_t *p_in, int i_in )
485 for( i = 0; i < i_in/2; i++ )
487 p_out[i*2] = p_in[i*2+1];
488 p_out[i*2+1] = p_in[i*2];
492 static int Buf14To16( uint8_t *p_out, const uint8_t *p_in, int i_in, int i_le )
494 unsigned char tmp, cur = 0;
495 int bits_in, bits_out = 0;
498 for( i = 0; i < i_in; i++ )
507 tmp = p_in[i+i_le] & 0x3F;
513 int need = __MIN( 8 - bits_out, bits_in );
515 cur |= ( tmp >> (bits_in - need) );
516 tmp <<= (8 - bits_in + need);
517 tmp >>= (8 - bits_in + need);
538 static inline int SyncCode( const uint8_t *p_buf )
540 /* 14 bits, little endian version of the bitstream */
541 if( p_buf[0] == 0xff && p_buf[1] == 0x1f &&
542 p_buf[2] == 0x00 && p_buf[3] == 0xe8 &&
543 (p_buf[4] & 0xf0) == 0xf0 && p_buf[5] == 0x07 )
547 /* 14 bits, big endian version of the bitstream */
548 else if( p_buf[0] == 0x1f && p_buf[1] == 0xff &&
549 p_buf[2] == 0xe8 && p_buf[3] == 0x00 &&
550 p_buf[4] == 0x07 && (p_buf[5] & 0xf0) == 0xf0 )
554 /* 16 bits, big endian version of the bitstream */
555 else if( p_buf[0] == 0x7f && p_buf[1] == 0xfe &&
556 p_buf[2] == 0x80 && p_buf[3] == 0x01 )
560 /* 16 bits, little endian version of the bitstream */
561 else if( p_buf[0] == 0xfe && p_buf[1] == 0x7f &&
562 p_buf[2] == 0x01 && p_buf[3] == 0x80 )
567 else if( p_buf[0] == 0x64 && p_buf[1] == 0x58 &&
568 p_buf[2] == 0x20 && p_buf[3] == 0x25 )
576 static int SyncInfo( const uint8_t *p_buf,
578 unsigned int *pi_channels,
579 unsigned int *pi_channels_conf,
580 unsigned int *pi_sample_rate,
581 unsigned int *pi_bit_rate,
582 unsigned int *pi_frame_length )
584 unsigned int i_audio_mode;
585 unsigned int i_frame_size;
587 /* 14 bits, little endian version of the bitstream */
588 if( p_buf[0] == 0xff && p_buf[1] == 0x1f &&
589 p_buf[2] == 0x00 && p_buf[3] == 0xe8 &&
590 (p_buf[4] & 0xf0) == 0xf0 && p_buf[5] == 0x07 )
592 uint8_t conv_buf[DTS_HEADER_SIZE];
593 Buf14To16( conv_buf, p_buf, DTS_HEADER_SIZE, 1 );
594 i_frame_size = SyncInfo16be( conv_buf, &i_audio_mode, pi_sample_rate,
595 pi_bit_rate, pi_frame_length );
596 i_frame_size = i_frame_size * 8 / 14 * 2;
598 /* 14 bits, big endian version of the bitstream */
599 else if( p_buf[0] == 0x1f && p_buf[1] == 0xff &&
600 p_buf[2] == 0xe8 && p_buf[3] == 0x00 &&
601 p_buf[4] == 0x07 && (p_buf[5] & 0xf0) == 0xf0 )
603 uint8_t conv_buf[DTS_HEADER_SIZE];
604 Buf14To16( conv_buf, p_buf, DTS_HEADER_SIZE, 0 );
605 i_frame_size = SyncInfo16be( conv_buf, &i_audio_mode, pi_sample_rate,
606 pi_bit_rate, pi_frame_length );
607 i_frame_size = i_frame_size * 8 / 14 * 2;
609 /* 16 bits, big endian version of the bitstream */
610 else if( p_buf[0] == 0x7f && p_buf[1] == 0xfe &&
611 p_buf[2] == 0x80 && p_buf[3] == 0x01 )
613 i_frame_size = SyncInfo16be( p_buf, &i_audio_mode, pi_sample_rate,
614 pi_bit_rate, pi_frame_length );
616 /* 16 bits, little endian version of the bitstream */
617 else if( p_buf[0] == 0xfe && p_buf[1] == 0x7f &&
618 p_buf[2] == 0x01 && p_buf[3] == 0x80 )
620 uint8_t conv_buf[DTS_HEADER_SIZE];
621 BufLeToBe( conv_buf, p_buf, DTS_HEADER_SIZE );
622 i_frame_size = SyncInfo16be( p_buf, &i_audio_mode, pi_sample_rate,
623 pi_bit_rate, pi_frame_length );
628 assert( p_buf[0] == 0x64 && p_buf[1] == 0x58 &&
629 p_buf[2] == 0x20 && p_buf[3] == 0x25 );
633 bs_init( &s, &p_buf[4], DTS_HEADER_SIZE - 4 );
635 bs_skip( &s, 8 + 2 );
640 i_dts_hd_size = bs_read( &s, 20 ) + 1;
645 i_dts_hd_size = bs_read( &s, 16 ) + 1;
647 //uint16_t s0 = bs_read( &s, 16 );
648 //uint16_t s1 = bs_read( &s, 16 );
649 //fprintf( stderr, "DTS HD=%d : %x %x\n", i_dts_hd_size, s0, s1 );
652 /* As we ignore the stream, do not modify those variables:
654 *pi_channels_conf = ;
659 return i_dts_hd_size;
664 switch( i_audio_mode & 0xFFFF )
668 *pi_channels_conf = AOUT_CHAN_CENTER;
671 /* Dual-mono = stereo + dual-mono */
672 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
680 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT;
685 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
691 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
692 AOUT_CHAN_REARCENTER;
697 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
698 AOUT_CHAN_CENTER | AOUT_CHAN_REARCENTER;
703 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
704 AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT;
709 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
710 AOUT_CHAN_CENTER | AOUT_CHAN_REARLEFT |
717 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
718 AOUT_CHAN_MIDDLELEFT | AOUT_CHAN_MIDDLERIGHT |
719 AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT;
724 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
725 AOUT_CHAN_CENTER | AOUT_CHAN_MIDDLELEFT |
726 AOUT_CHAN_MIDDLERIGHT | AOUT_CHAN_REARLEFT |
733 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
734 AOUT_CHAN_CENTER | AOUT_CHAN_MIDDLELEFT |
735 AOUT_CHAN_MIDDLERIGHT | AOUT_CHAN_REARLEFT |
736 AOUT_CHAN_REARRIGHT | AOUT_CHAN_LFE;
740 if( i_audio_mode <= 63 )
744 *pi_channels_conf = 0;
750 if( i_audio_mode & 0x10000 )
753 *pi_channels_conf |= AOUT_CHAN_LFE;
756 if( *pi_sample_rate >= sizeof( ppi_dts_samplerate ) /
757 sizeof( ppi_dts_samplerate[0] ) )
761 *pi_sample_rate = ppi_dts_samplerate[ *pi_sample_rate ];
762 if( !*pi_sample_rate ) return 0;
764 if( *pi_bit_rate >= sizeof( ppi_dts_bitrate ) /
765 sizeof( ppi_dts_bitrate[0] ) )
769 *pi_bit_rate = ppi_dts_bitrate[ *pi_bit_rate ];
770 if( !*pi_bit_rate ) return 0;
772 *pi_frame_length = (*pi_frame_length + 1) * 32;