1 /*****************************************************************************
2 * dts.c: parse DTS audio sync info and packetize the stream
3 *****************************************************************************
4 * Copyright (C) 2003-2005 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 *****************************************************************************/
32 #include <vlc_common.h>
33 #include <vlc_plugin.h>
34 #include <vlc_codec.h>
36 #include <vlc_block_helper.h>
38 #define DTS_HEADER_SIZE 14
40 /*****************************************************************************
41 * decoder_sys_t : decoder descriptor
42 *****************************************************************************/
53 block_bytestream_t bytestream;
58 audio_date_t end_date;
62 unsigned int i_bit_rate;
63 unsigned int i_frame_size;
64 unsigned int i_frame_length;
66 unsigned int i_channels;
67 unsigned int i_channels_conf;
80 /****************************************************************************
82 ****************************************************************************/
83 static int OpenDecoder ( vlc_object_t * );
84 static int OpenPacketizer( vlc_object_t * );
85 static void CloseDecoder ( vlc_object_t * );
86 static void *DecodeBlock ( decoder_t *, block_t ** );
88 static inline int SyncCode( const uint8_t * );
89 static int SyncInfo ( const uint8_t *, unsigned int *, unsigned int *,
90 unsigned int *, unsigned int *, unsigned int * );
92 static uint8_t *GetOutBuffer ( decoder_t *, void ** );
93 static aout_buffer_t *GetAoutBuffer( decoder_t * );
94 static block_t *GetSoutBuffer( decoder_t * );
96 /*****************************************************************************
98 *****************************************************************************/
100 set_description( N_("DTS parser") );
101 set_capability( "decoder", 100 );
102 set_callbacks( OpenDecoder, CloseDecoder );
105 set_description( N_("DTS audio packetizer") );
106 set_capability( "packetizer", 10 );
107 set_callbacks( OpenPacketizer, CloseDecoder );
110 /*****************************************************************************
111 * OpenDecoder: probe the decoder and return score
112 *****************************************************************************/
113 static int OpenDecoder( vlc_object_t *p_this )
115 decoder_t *p_dec = (decoder_t*)p_this;
116 decoder_sys_t *p_sys;
118 if( p_dec->fmt_in.i_codec != VLC_FOURCC('d','t','s',' ')
119 && p_dec->fmt_in.i_codec != VLC_FOURCC('d','t','s','b') )
124 /* Allocate the memory needed to store the decoder's structure */
125 if( ( p_dec->p_sys = p_sys =
126 (decoder_sys_t *)malloc(sizeof(decoder_sys_t)) ) == NULL )
130 p_sys->b_packetizer = false;
131 p_sys->i_state = STATE_NOSYNC;
132 aout_DateSet( &p_sys->end_date, 0 );
134 p_sys->bytestream = block_BytestreamInit();
136 /* Set output properties */
137 p_dec->fmt_out.i_cat = AUDIO_ES;
138 p_dec->fmt_out.i_codec = VLC_FOURCC('d','t','s',' ');
139 p_dec->fmt_out.audio.i_rate = 0; /* So end_date gets initialized */
142 p_dec->pf_decode_audio = (aout_buffer_t *(*)(decoder_t *, block_t **))
144 p_dec->pf_packetize = (block_t *(*)(decoder_t *, block_t **))
150 static int OpenPacketizer( vlc_object_t *p_this )
152 decoder_t *p_dec = (decoder_t*)p_this;
154 int i_ret = OpenDecoder( p_this );
156 if( i_ret == VLC_SUCCESS ) p_dec->p_sys->b_packetizer = true;
161 /****************************************************************************
162 * DecodeBlock: the whole thing
163 ****************************************************************************
164 * This function is called just after the thread is launched.
165 ****************************************************************************/
166 static void *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
168 decoder_sys_t *p_sys = p_dec->p_sys;
169 uint8_t p_header[DTS_HEADER_SIZE];
173 if( !pp_block || !*pp_block ) return NULL;
175 if( (*pp_block)->i_flags&(BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
177 if( (*pp_block)->i_flags&BLOCK_FLAG_CORRUPTED )
179 p_sys->i_state = STATE_NOSYNC;
180 block_BytestreamFlush( &p_sys->bytestream );
182 // aout_DateSet( &p_sys->end_date, 0 );
183 block_Release( *pp_block );
187 if( !aout_DateGet( &p_sys->end_date ) && !(*pp_block)->i_pts )
189 /* We've just started the stream, wait for the first PTS. */
190 block_Release( *pp_block );
194 block_BytestreamPush( &p_sys->bytestream, *pp_block );
198 switch( p_sys->i_state )
201 /* Look for sync code - should be 0x7ffe8001 */
202 while( block_PeekBytes( &p_sys->bytestream, p_header, 6 )
205 if( SyncCode( p_header ) == VLC_SUCCESS )
207 p_sys->i_state = STATE_SYNC;
210 block_SkipByte( &p_sys->bytestream );
212 if( p_sys->i_state != STATE_SYNC )
214 block_BytestreamFlush( &p_sys->bytestream );
221 /* New frame, set the Presentation Time Stamp */
222 p_sys->i_pts = p_sys->bytestream.p_block->i_pts;
223 if( p_sys->i_pts != 0 &&
224 p_sys->i_pts != aout_DateGet( &p_sys->end_date ) )
226 aout_DateSet( &p_sys->end_date, p_sys->i_pts );
228 p_sys->i_state = STATE_HEADER;
231 /* Get DTS frame header (DTS_HEADER_SIZE bytes) */
232 if( block_PeekBytes( &p_sys->bytestream, p_header,
233 DTS_HEADER_SIZE ) != VLC_SUCCESS )
239 /* Check if frame is valid and get frame info */
240 p_sys->i_frame_size = SyncInfo( p_header,
242 &p_sys->i_channels_conf,
245 &p_sys->i_frame_length );
246 if( !p_sys->i_frame_size )
248 msg_Dbg( p_dec, "emulated sync word" );
249 block_SkipByte( &p_sys->bytestream );
250 p_sys->i_state = STATE_NOSYNC;
253 p_sys->i_state = STATE_NEXT_SYNC;
255 case STATE_NEXT_SYNC:
256 /* TODO: If pp_block == NULL, flush the buffer without checking the
259 /* Check if next expected frame contains the sync word */
260 if( block_PeekOffsetBytes( &p_sys->bytestream,
261 p_sys->i_frame_size, p_header, 6 )
268 if( SyncCode( p_header ) != VLC_SUCCESS )
270 msg_Dbg( p_dec, "emulated sync word "
271 "(no sync on following frame): %2.2x%2.2x%2.2x%2.2x",
272 (int)p_header[0], (int)p_header[1],
273 (int)p_header[2], (int)p_header[3] );
274 p_sys->i_state = STATE_NOSYNC;
275 block_SkipByte( &p_sys->bytestream );
278 p_sys->i_state = STATE_SEND_DATA;
282 /* Make sure we have enough data.
283 * (Not useful if we went through NEXT_SYNC) */
284 if( block_WaitBytes( &p_sys->bytestream,
285 p_sys->i_frame_size ) != VLC_SUCCESS )
290 p_sys->i_state = STATE_SEND_DATA;
292 case STATE_SEND_DATA:
293 if( !(p_buf = GetOutBuffer( p_dec, &p_out_buffer )) )
295 //p_dec->b_error = true;
299 /* Copy the whole frame into the buffer. When we reach this point
300 * we already know we have enough data available. */
301 block_GetBytes( &p_sys->bytestream, p_buf, p_sys->i_frame_size );
303 /* Make sure we don't reuse the same pts twice */
304 if( p_sys->i_pts == p_sys->bytestream.p_block->i_pts )
305 p_sys->i_pts = p_sys->bytestream.p_block->i_pts = 0;
307 p_sys->i_state = STATE_NOSYNC;
309 /* So p_block doesn't get re-added several times */
310 *pp_block = block_BytestreamPop( &p_sys->bytestream );
319 /*****************************************************************************
320 * CloseDecoder: clean up the decoder
321 *****************************************************************************/
322 static void CloseDecoder( vlc_object_t *p_this )
324 decoder_t *p_dec = (decoder_t*)p_this;
325 decoder_sys_t *p_sys = p_dec->p_sys;
327 block_BytestreamRelease( &p_sys->bytestream );
332 /*****************************************************************************
334 *****************************************************************************/
335 static uint8_t *GetOutBuffer( decoder_t *p_dec, void **pp_out_buffer )
337 decoder_sys_t *p_sys = p_dec->p_sys;
340 if( p_dec->fmt_out.audio.i_rate != p_sys->i_rate )
342 msg_Info( p_dec, "DTS channels:%d samplerate:%d bitrate:%d",
343 p_sys->i_channels, p_sys->i_rate, p_sys->i_bit_rate );
345 aout_DateInit( &p_sys->end_date, p_sys->i_rate );
346 aout_DateSet( &p_sys->end_date, p_sys->i_pts );
349 p_dec->fmt_out.audio.i_rate = p_sys->i_rate;
350 p_dec->fmt_out.audio.i_channels = p_sys->i_channels;
351 /* Hack for DTS S/PDIF filter which needs to pad the DTS frames */
352 p_dec->fmt_out.audio.i_bytes_per_frame =
353 __MAX( p_sys->i_frame_size, p_sys->i_frame_length * 4 );
354 p_dec->fmt_out.audio.i_frame_length = p_sys->i_frame_length;
356 p_dec->fmt_out.audio.i_original_channels = p_sys->i_channels_conf;
357 p_dec->fmt_out.audio.i_physical_channels =
358 p_sys->i_channels_conf & AOUT_CHAN_PHYSMASK;
360 p_dec->fmt_out.i_bitrate = p_sys->i_bit_rate;
362 if( p_sys->b_packetizer )
364 block_t *p_sout_buffer = GetSoutBuffer( p_dec );
365 p_buf = p_sout_buffer ? p_sout_buffer->p_buffer : NULL;
366 *pp_out_buffer = p_sout_buffer;
370 aout_buffer_t *p_aout_buffer = GetAoutBuffer( p_dec );
371 p_buf = p_aout_buffer ? p_aout_buffer->p_buffer : NULL;
372 *pp_out_buffer = p_aout_buffer;
378 /*****************************************************************************
380 *****************************************************************************/
381 static aout_buffer_t *GetAoutBuffer( decoder_t *p_dec )
383 decoder_sys_t *p_sys = p_dec->p_sys;
384 aout_buffer_t *p_buf;
386 /* Hack for DTS S/PDIF filter which needs to send 3 frames at a time
387 * (plus a few header bytes) */
388 p_buf = p_dec->pf_aout_buffer_new( p_dec, p_sys->i_frame_length * 4 );
389 if( p_buf == NULL ) return NULL;
390 p_buf->i_nb_samples = p_sys->i_frame_length;
391 p_buf->i_nb_bytes = p_sys->i_frame_size;
393 p_buf->start_date = aout_DateGet( &p_sys->end_date );
395 aout_DateIncrement( &p_sys->end_date, p_sys->i_frame_length );
400 /*****************************************************************************
402 *****************************************************************************/
403 static block_t *GetSoutBuffer( decoder_t *p_dec )
405 decoder_sys_t *p_sys = p_dec->p_sys;
408 p_block = block_New( p_dec, p_sys->i_frame_size );
409 if( p_block == NULL ) return NULL;
411 p_block->i_pts = p_block->i_dts = aout_DateGet( &p_sys->end_date );
413 p_block->i_length = aout_DateIncrement( &p_sys->end_date,
414 p_sys->i_frame_length ) - p_block->i_pts;
419 /*****************************************************************************
420 * SyncInfo: parse DTS sync info
421 *****************************************************************************/
422 static const unsigned int ppi_dts_samplerate[] =
424 0, 8000, 16000, 32000, 0, 0, 11025, 22050, 44100, 0, 0,
425 12000, 24000, 48000, 96000, 192000
428 static const unsigned int ppi_dts_bitrate[] =
430 32000, 56000, 64000, 96000, 112000, 128000,
431 192000, 224000, 256000, 320000, 384000,
432 448000, 512000, 576000, 640000, 768000,
433 896000, 1024000, 1152000, 1280000, 1344000,
434 1408000, 1411200, 1472000, 1536000, 1920000,
435 2048000, 3072000, 3840000, 1/*open*/, 2/*variable*/, 3/*lossless*/
438 static int SyncInfo16be( const uint8_t *p_buf,
439 unsigned int *pi_audio_mode,
440 unsigned int *pi_sample_rate,
441 unsigned int *pi_bit_rate,
442 unsigned int *pi_frame_length )
444 unsigned int i_frame_size;
447 *pi_frame_length = (p_buf[4] & 0x01) << 6 | (p_buf[5] >> 2);
448 i_frame_size = (p_buf[5] & 0x03) << 12 | (p_buf[6] << 4) |
451 *pi_audio_mode = (p_buf[7] & 0x0f) << 2 | (p_buf[8] >> 6);
452 *pi_sample_rate = (p_buf[8] >> 2) & 0x0f;
453 *pi_bit_rate = (p_buf[8] & 0x03) << 3 | ((p_buf[9] >> 5) & 0x07);
455 i_lfe = (p_buf[10] >> 1) & 0x03;
456 if( i_lfe ) *pi_audio_mode |= 0x10000;
458 return i_frame_size + 1;
461 static void BufLeToBe( uint8_t *p_out, const uint8_t *p_in, int i_in )
465 for( i = 0; i < i_in/2; i++ )
467 p_out[i*2] = p_in[i*2+1];
468 p_out[i*2+1] = p_in[i*2];
472 static int Buf14To16( uint8_t *p_out, const uint8_t *p_in, int i_in, int i_le )
474 unsigned char tmp, cur = 0;
475 int bits_in, bits_out = 0;
478 for( i = 0; i < i_in; i++ )
487 tmp = p_in[i+i_le] & 0x3F;
493 int need = __MIN( 8 - bits_out, bits_in );
495 cur |= ( tmp >> (bits_in - need) );
496 tmp <<= (8 - bits_in + need);
497 tmp >>= (8 - bits_in + need);
518 static inline int SyncCode( const uint8_t *p_buf )
520 /* 14 bits, little endian version of the bitstream */
521 if( p_buf[0] == 0xff && p_buf[1] == 0x1f &&
522 p_buf[2] == 0x00 && p_buf[3] == 0xe8 &&
523 (p_buf[4] & 0xf0) == 0xf0 && p_buf[5] == 0x07 )
527 /* 14 bits, big endian version of the bitstream */
528 else if( p_buf[0] == 0x1f && p_buf[1] == 0xff &&
529 p_buf[2] == 0xe8 && p_buf[3] == 0x00 &&
530 p_buf[4] == 0x07 && (p_buf[5] & 0xf0) == 0xf0 )
534 /* 16 bits, big endian version of the bitstream */
535 else if( p_buf[0] == 0x7f && p_buf[1] == 0xfe &&
536 p_buf[2] == 0x80 && p_buf[3] == 0x01 )
540 /* 16 bits, little endian version of the bitstream */
541 else if( p_buf[0] == 0xfe && p_buf[1] == 0x7f &&
542 p_buf[2] == 0x01 && p_buf[3] == 0x80 )
546 else return VLC_EGENERIC;
549 static int SyncInfo( const uint8_t *p_buf,
550 unsigned int *pi_channels,
551 unsigned int *pi_channels_conf,
552 unsigned int *pi_sample_rate,
553 unsigned int *pi_bit_rate,
554 unsigned int *pi_frame_length )
556 unsigned int i_audio_mode;
557 unsigned int i_frame_size;
559 /* 14 bits, little endian version of the bitstream */
560 if( p_buf[0] == 0xff && p_buf[1] == 0x1f &&
561 p_buf[2] == 0x00 && p_buf[3] == 0xe8 &&
562 (p_buf[4] & 0xf0) == 0xf0 && p_buf[5] == 0x07 )
564 uint8_t conv_buf[DTS_HEADER_SIZE];
565 Buf14To16( conv_buf, p_buf, DTS_HEADER_SIZE, 1 );
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 /* 14 bits, big endian version of the bitstream */
571 else if( p_buf[0] == 0x1f && p_buf[1] == 0xff &&
572 p_buf[2] == 0xe8 && p_buf[3] == 0x00 &&
573 p_buf[4] == 0x07 && (p_buf[5] & 0xf0) == 0xf0 )
575 uint8_t conv_buf[DTS_HEADER_SIZE];
576 Buf14To16( conv_buf, p_buf, DTS_HEADER_SIZE, 0 );
577 i_frame_size = SyncInfo16be( conv_buf, &i_audio_mode, pi_sample_rate,
578 pi_bit_rate, pi_frame_length );
579 i_frame_size = i_frame_size * 8 / 14 * 2;
581 /* 16 bits, big endian version of the bitstream */
582 else if( p_buf[0] == 0x7f && p_buf[1] == 0xfe &&
583 p_buf[2] == 0x80 && p_buf[3] == 0x01 )
585 i_frame_size = SyncInfo16be( p_buf, &i_audio_mode, pi_sample_rate,
586 pi_bit_rate, pi_frame_length );
588 /* 16 bits, little endian version of the bitstream */
589 else if( p_buf[0] == 0xfe && p_buf[1] == 0x7f &&
590 p_buf[2] == 0x01 && p_buf[3] == 0x80 )
592 uint8_t conv_buf[DTS_HEADER_SIZE];
593 BufLeToBe( conv_buf, p_buf, DTS_HEADER_SIZE );
594 i_frame_size = SyncInfo16be( p_buf, &i_audio_mode, pi_sample_rate,
595 pi_bit_rate, pi_frame_length );
599 switch( i_audio_mode & 0xFFFF )
603 *pi_channels_conf = AOUT_CHAN_CENTER;
606 /* Dual-mono = stereo + dual-mono */
607 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
615 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT;
620 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
626 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
627 AOUT_CHAN_REARCENTER;
632 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
633 AOUT_CHAN_CENTER | AOUT_CHAN_REARCENTER;
638 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
639 AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT;
644 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
645 AOUT_CHAN_CENTER | AOUT_CHAN_REARLEFT |
652 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
653 AOUT_CHAN_MIDDLELEFT | AOUT_CHAN_MIDDLERIGHT |
654 AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT;
659 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
660 AOUT_CHAN_CENTER | AOUT_CHAN_MIDDLELEFT |
661 AOUT_CHAN_MIDDLERIGHT | AOUT_CHAN_REARLEFT |
668 *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
669 AOUT_CHAN_CENTER | AOUT_CHAN_MIDDLELEFT |
670 AOUT_CHAN_MIDDLERIGHT | AOUT_CHAN_REARLEFT |
671 AOUT_CHAN_REARRIGHT | AOUT_CHAN_LFE;
675 if( i_audio_mode <= 63 )
679 *pi_channels_conf = 0;
685 if( i_audio_mode & 0x10000 )
688 *pi_channels_conf |= AOUT_CHAN_LFE;
691 if( *pi_sample_rate >= sizeof( ppi_dts_samplerate ) /
692 sizeof( ppi_dts_samplerate[0] ) )
696 *pi_sample_rate = ppi_dts_samplerate[ *pi_sample_rate ];
697 if( !*pi_sample_rate ) return 0;
699 if( *pi_bit_rate >= sizeof( ppi_dts_bitrate ) /
700 sizeof( ppi_dts_bitrate[0] ) )
704 *pi_bit_rate = ppi_dts_bitrate[ *pi_bit_rate ];
705 if( !*pi_bit_rate ) return 0;
707 *pi_frame_length = (*pi_frame_length + 1) * 32;