4
4
* (http://developers.videolan.org/libdca.html).
5
5
*****************************************************************************
6
6
* Copyright (C) 2001, 2002libdca the VideoLAN team
7
* $Id: 1d7c79a1fffe22d84b6d17467c7e8eb5f5ee6864 $
9
9
* Author: Gildas Bazin <gbazin@videolan.org>
26
26
/*****************************************************************************
28
28
*****************************************************************************/
31
#include <stdlib.h> /* malloc(), free() */
32
#include <string.h> /* strdup() */
34
#include <dts.h> /* libdca header file */
36
#include <vlc/decoder.h>
37
#include "aout_internal.h"
33
#include <vlc_common.h>
34
#include <vlc_plugin.h>
37
#include <dca.h> /* libdca header file */
40
#include <vlc_block.h>
38
41
#include "vlc_filter.h"
40
43
/*****************************************************************************
52
55
static void CloseFilter( vlc_object_t * );
53
56
static block_t *Convert( filter_t *, block_t * );
55
/* libdca channel order */
58
/* libdca channel order
59
* FIXME middle values should be checked */
56
60
static const uint32_t pi_channels_in[] =
57
{ AOUT_CHAN_CENTER, AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT,
58
AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT, AOUT_CHAN_LFE, 0 };
59
/* our internal channel order (WG-4 order) */
60
static const uint32_t pi_channels_out[] =
61
{ AOUT_CHAN_LEFT, AOUT_CHAN_RIGHT, AOUT_CHAN_REARLEFT, AOUT_CHAN_REARRIGHT,
62
AOUT_CHAN_CENTER, AOUT_CHAN_LFE, 0 };
61
{ AOUT_CHAN_LFE, AOUT_CHAN_LEFT, AOUT_CHAN_CENTER, AOUT_CHAN_RIGHT,
62
AOUT_CHAN_REARLEFT, AOUT_CHAN_REARCENTER, AOUT_CHAN_REARRIGHT,
63
AOUT_CHAN_MIDDLELEFT, AOUT_CHAN_MIDDLERIGHT,
64
66
/*****************************************************************************
66
68
*****************************************************************************/
67
69
struct filter_sys_t
69
dts_state_t * p_libdts; /* libdca internal structure */
70
vlc_bool_t b_dynrng; /* see below */
71
dca_state_t * p_libdca; /* libdca internal structure */
72
bool b_dynrng; /* see below */
71
73
int i_flags; /* libdca flags, see dtsdec/doc/libdts.txt */
72
vlc_bool_t b_dontwarn;
73
75
int i_nb_channels; /* number of float32 per sample */
75
77
int pi_chan_table[AOUT_CHAN_MAX]; /* channel reordering */
90
92
set_category( CAT_INPUT );
91
93
set_subcategory( SUBCAT_INPUT_ACODEC );
92
94
set_shortname( "DCA" );
93
set_description( _("DTS Coherent Acoustics audio decoder") );
94
add_bool( "dts-dynrng", 1, NULL, DYNRNG_TEXT, DYNRNG_LONGTEXT, VLC_FALSE );
95
set_description( N_("DTS Coherent Acoustics audio decoder") );
96
add_bool( "dts-dynrng", 1, NULL, DYNRNG_TEXT, DYNRNG_LONGTEXT, false );
95
97
set_capability( "audio filter", 100 );
96
98
set_callbacks( Create, Destroy );
99
set_description( _("DTS Coherent Acoustics audio decoder") );
101
set_description( N_("DTS Coherent Acoustics audio decoder") );
100
102
set_capability( "audio filter2", 100 );
101
103
set_callbacks( OpenFilter, CloseFilter );
102
104
vlc_module_end();
125
127
p_sys = malloc( sizeof(filter_sys_t) );
126
128
p_filter->p_sys = (struct aout_filter_sys_t *)p_sys;
127
129
if( p_sys == NULL )
129
msg_Err( p_filter, "out of memory" );
133
132
i_ret = Open( VLC_OBJECT(p_filter), p_sys,
134
133
p_filter->input, p_filter->output );
142
141
/*****************************************************************************
144
143
*****************************************************************************/
145
144
static int Open( vlc_object_t *p_this, filter_sys_t *p_sys,
146
145
audio_format_t input, audio_format_t output )
158
157
|| (output.i_original_channels
159
158
& (AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT)) )
161
p_sys->i_flags = DTS_MONO;
160
p_sys->i_flags = DCA_MONO;
165
164
case AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT:
166
165
if ( output.i_original_channels & AOUT_CHAN_DOLBYSTEREO )
168
p_sys->i_flags = DTS_DOLBY;
167
p_sys->i_flags = DCA_DOLBY;
170
169
else if ( input.i_original_channels == AOUT_CHAN_CENTER )
172
p_sys->i_flags = DTS_MONO;
171
p_sys->i_flags = DCA_MONO;
174
173
else if ( input.i_original_channels & AOUT_CHAN_DUALMONO )
176
p_sys->i_flags = DTS_CHANNEL;
175
p_sys->i_flags = DCA_CHANNEL;
180
p_sys->i_flags = DTS_STEREO;
179
p_sys->i_flags = DCA_STEREO;
184
183
case AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER:
185
p_sys->i_flags = DTS_3F;
184
p_sys->i_flags = DCA_3F;
188
187
case AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_REARCENTER:
189
p_sys->i_flags = DTS_2F1R;
188
p_sys->i_flags = DCA_2F1R;
192
191
case AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER
193
192
| AOUT_CHAN_REARCENTER:
194
p_sys->i_flags = DTS_3F1R;
193
p_sys->i_flags = DCA_3F1R;
197
196
case AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT
198
197
| AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT:
199
p_sys->i_flags = DTS_2F2R;
198
p_sys->i_flags = DCA_2F2R;
202
201
case AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER
203
202
| AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT:
204
p_sys->i_flags = DTS_3F2R;
203
p_sys->i_flags = DCA_3F2R;
212
211
if ( output.i_physical_channels & AOUT_CHAN_LFE )
214
p_sys->i_flags |= DTS_LFE;
213
p_sys->i_flags |= DCA_LFE;
216
//p_sys->i_flags |= DTS_ADJUST_LEVEL;
215
//p_sys->i_flags |= DCA_ADJUST_LEVEL;
218
217
/* Initialize libdca */
219
p_sys->p_libdts = dts_init( 0 );
220
if( p_sys->p_libdts == NULL )
218
p_sys->p_libdca = dca_init( 0 );
219
if( p_sys->p_libdca == NULL )
222
221
msg_Err( p_this, "unable to initialize libdca" );
223
222
return VLC_EGENERIC;
226
aout_CheckChannelReorder( pi_channels_in, pi_channels_out,
225
aout_CheckChannelReorder( pi_channels_in, NULL,
227
226
output.i_physical_channels & AOUT_CHAN_PHYSMASK,
228
227
p_sys->i_nb_channels,
229
228
p_sys->pi_chan_table );
300
299
/* Needs to be called so the decoder knows which type of bitstream it is
301
300
* dealing with. */
302
301
int i_sample_rate, i_bit_rate, i_frame_length;
303
if( !dts_syncinfo( p_sys->p_libdts, p_in_buf->p_buffer, &i_flags,
302
if( !dca_syncinfo( p_sys->p_libdca, p_in_buf->p_buffer, &i_flags,
304
303
&i_sample_rate, &i_bit_rate, &i_frame_length ) )
306
305
msg_Warn( p_aout, "libdca couldn't sync on frame" );
311
310
i_flags = p_sys->i_flags;
312
dts_frame( p_sys->p_libdts, p_in_buf->p_buffer,
311
dca_frame( p_sys->p_libdca, p_in_buf->p_buffer,
313
312
&i_flags, &i_sample_level, 0 );
315
if ( (i_flags & DTS_CHANNEL_MASK) != (p_sys->i_flags & DTS_CHANNEL_MASK)
314
if ( (i_flags & DCA_CHANNEL_MASK) != (p_sys->i_flags & DCA_CHANNEL_MASK)
316
315
&& !p_sys->b_dontwarn )
318
317
msg_Warn( p_aout,
319
318
"libdca couldn't do the requested downmix 0x%x->0x%x",
320
p_sys->i_flags & DTS_CHANNEL_MASK,
321
i_flags & DTS_CHANNEL_MASK );
319
p_sys->i_flags & DCA_CHANNEL_MASK,
320
i_flags & DCA_CHANNEL_MASK );
323
322
p_sys->b_dontwarn = 1;
326
325
if( 0)//!p_sys->b_dynrng )
328
dts_dynrng( p_sys->p_libdts, NULL, NULL );
327
dca_dynrng( p_sys->p_libdca, NULL, NULL );
331
for ( i = 0; i < dts_blocks_num(p_sys->p_libdts); i++ )
330
for ( i = 0; i < dca_blocks_num(p_sys->p_libdca); i++ )
333
332
sample_t * p_samples;
335
if( dts_block( p_sys->p_libdts ) )
334
if( dca_block( p_sys->p_libdca ) )
337
msg_Warn( p_aout, "dts_block failed for block %d", i );
336
msg_Warn( p_aout, "dca_block failed for block %d", i );
341
p_samples = dts_samples( p_sys->p_libdts );
340
p_samples = dca_samples( p_sys->p_libdca );
343
if ( (p_sys->i_flags & DTS_CHANNEL_MASK) == DTS_MONO
344
&& (p_filter->output.i_physical_channels
342
if ( (p_sys->i_flags & DCA_CHANNEL_MASK) == DCA_MONO
343
&& (p_filter->output.i_physical_channels
345
344
& (AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT)) )
347
346
Duplicate( (float *)(p_out_buf->p_buffer + i * i_bytes_per_block),
373
372
aout_filter_t *p_filter = (aout_filter_t *)p_this;
374
373
filter_sys_t *p_sys = (filter_sys_t *)p_filter->p_sys;
376
dts_free( p_sys->p_libdts );
375
dca_free( p_sys->p_libdca );
380
379
/*****************************************************************************
382
381
*****************************************************************************/
383
382
static int OpenFilter( vlc_object_t *p_this )
394
393
p_filter->fmt_out.audio.i_format =
395
394
p_filter->fmt_out.i_codec = VLC_FOURCC('f','l','3','2');
395
p_filter->fmt_out.audio.i_bitspersample =
396
aout_BitsPerSample( p_filter->fmt_out.i_codec );
397
398
/* Allocate the memory needed to store the module's structure */
398
399
p_sys = p_filter->p_sys = malloc( sizeof(filter_sys_t) );
399
400
if( p_sys == NULL )
401
msg_Err( p_filter, "out of memory" );
405
/* Allocate the memory needed to store the module's structure */
406
p_filter->p_sys = p_sys = malloc( sizeof(filter_sys_t) );
409
msg_Err( p_filter, "out of memory" );
413
403
i_ret = Open( VLC_OBJECT(p_filter), p_sys,
414
404
p_filter->fmt_in.audio, p_filter->fmt_out.audio );