1 /*****************************************************************************
2 * decoder.c: AAC decoder using libfaad2
3 *****************************************************************************
4 * Copyright (C) 2001, 2003 the VideoLAN team
7 * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8 * Gildas Bazin <gbazin@videolan.org>
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 *****************************************************************************/
29 #include <vlc_common.h>
30 #include <vlc_plugin.h>
31 #include <vlc_input.h>
33 #include <vlc_codec.h>
37 /*****************************************************************************
39 *****************************************************************************/
40 static int Open( vlc_object_t
* );
41 static void Close( vlc_object_t
* );
44 set_description( N_("AAC audio decoder (using libfaad2)") );
45 set_capability( "decoder", 100 );
46 set_category( CAT_INPUT
);
47 set_subcategory( SUBCAT_INPUT_ACODEC
);
48 set_callbacks( Open
, Close
);
51 /****************************************************************************
53 ****************************************************************************/
54 static aout_buffer_t
*DecodeBlock( decoder_t
*, block_t
** );
55 static void DoReordering( uint32_t *, uint32_t *, int, int, uint32_t * );
57 #define MAX_CHANNEL_POSITIONS 9
67 /* temporary buffer */
72 /* Channel positions of the current stream (for re-ordering) */
73 uint32_t pi_channel_positions
[MAX_CHANNEL_POSITIONS
];
78 static const uint32_t pi_channels_in
[MAX_CHANNEL_POSITIONS
] =
79 { FRONT_CHANNEL_CENTER
, FRONT_CHANNEL_LEFT
, FRONT_CHANNEL_RIGHT
,
80 SIDE_CHANNEL_LEFT
, SIDE_CHANNEL_RIGHT
,
81 BACK_CHANNEL_LEFT
, BACK_CHANNEL_RIGHT
,
82 BACK_CHANNEL_CENTER
, LFE_CHANNEL
};
83 static const uint32_t pi_channels_out
[MAX_CHANNEL_POSITIONS
] =
84 { AOUT_CHAN_CENTER
, AOUT_CHAN_LEFT
, AOUT_CHAN_RIGHT
,
85 AOUT_CHAN_MIDDLELEFT
, AOUT_CHAN_MIDDLERIGHT
,
86 AOUT_CHAN_REARLEFT
, AOUT_CHAN_REARRIGHT
,
87 AOUT_CHAN_REARCENTER
, AOUT_CHAN_LFE
};
88 static const uint32_t pi_channels_ordered
[MAX_CHANNEL_POSITIONS
] =
89 { AOUT_CHAN_LEFT
, AOUT_CHAN_RIGHT
,
90 AOUT_CHAN_MIDDLELEFT
, AOUT_CHAN_MIDDLERIGHT
,
91 AOUT_CHAN_REARLEFT
, AOUT_CHAN_REARRIGHT
,
92 AOUT_CHAN_CENTER
, AOUT_CHAN_REARCENTER
, AOUT_CHAN_LFE
94 static const uint32_t pi_channels_guessed
[MAX_CHANNEL_POSITIONS
] =
95 { 0, AOUT_CHAN_CENTER
, AOUT_CHAN_LEFT
| AOUT_CHAN_RIGHT
,
96 AOUT_CHAN_LEFT
| AOUT_CHAN_RIGHT
| AOUT_CHAN_LFE
,
97 AOUT_CHAN_LEFT
| AOUT_CHAN_RIGHT
| AOUT_CHAN_REARLEFT
98 | AOUT_CHAN_REARRIGHT
,
99 AOUT_CHAN_LEFT
| AOUT_CHAN_RIGHT
| AOUT_CHAN_REARLEFT
100 | AOUT_CHAN_REARRIGHT
| AOUT_CHAN_CENTER
,
101 AOUT_CHAN_LEFT
| AOUT_CHAN_RIGHT
| AOUT_CHAN_REARLEFT
102 | AOUT_CHAN_REARRIGHT
| AOUT_CHAN_CENTER
| AOUT_CHAN_LFE
,
103 AOUT_CHAN_LEFT
| AOUT_CHAN_RIGHT
| AOUT_CHAN_MIDDLELEFT
104 | AOUT_CHAN_MIDDLERIGHT
| AOUT_CHAN_REARLEFT
| AOUT_CHAN_REARRIGHT
106 AOUT_CHAN_LEFT
| AOUT_CHAN_RIGHT
| AOUT_CHAN_MIDDLELEFT
107 | AOUT_CHAN_MIDDLERIGHT
| AOUT_CHAN_REARLEFT
| AOUT_CHAN_REARRIGHT
108 | AOUT_CHAN_CENTER
| AOUT_CHAN_LFE
111 /*****************************************************************************
112 * OpenDecoder: probe the decoder and return score
113 *****************************************************************************/
114 static int Open( vlc_object_t
*p_this
)
116 decoder_t
*p_dec
= (decoder_t
*)p_this
;
117 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
118 faacDecConfiguration
*cfg
;
120 if( p_dec
->fmt_in
.i_codec
!= VLC_FOURCC('m','p','4','a') )
125 /* Allocate the memory needed to store the decoder's structure */
126 if( ( p_dec
->p_sys
= p_sys
=
127 (decoder_sys_t
*)malloc(sizeof(decoder_sys_t
)) ) == NULL
)
130 /* Open a faad context */
131 if( ( p_sys
->hfaad
= faacDecOpen() ) == NULL
)
133 msg_Err( p_dec
, "cannot initialize faad" );
138 aout_DateSet( &p_sys
->date
, 0 );
139 p_dec
->fmt_out
.i_cat
= AUDIO_ES
;
141 if (vlc_CPU() & CPU_CAPABILITY_FPU
)
142 p_dec
->fmt_out
.i_codec
= VLC_FOURCC('f','l','3','2');
144 p_dec
->fmt_out
.i_codec
= AOUT_FMT_S16_NE
;
145 p_dec
->pf_decode_audio
= DecodeBlock
;
147 p_dec
->fmt_out
.audio
.i_physical_channels
=
148 p_dec
->fmt_out
.audio
.i_original_channels
= 0;
150 if( p_dec
->fmt_in
.i_extra
> 0 )
152 /* We have a decoder config so init the handle */
153 unsigned long i_rate
;
154 unsigned char i_channels
;
156 if( faacDecInit2( p_sys
->hfaad
, p_dec
->fmt_in
.p_extra
,
157 p_dec
->fmt_in
.i_extra
,
158 &i_rate
, &i_channels
) < 0 )
163 p_dec
->fmt_out
.audio
.i_rate
= i_rate
;
164 p_dec
->fmt_out
.audio
.i_channels
= i_channels
;
165 p_dec
->fmt_out
.audio
.i_physical_channels
166 = p_dec
->fmt_out
.audio
.i_original_channels
167 = pi_channels_guessed
[i_channels
];
168 aout_DateInit( &p_sys
->date
, i_rate
);
172 /* Will be initalised from first frame */
173 p_dec
->fmt_out
.audio
.i_rate
= 0;
174 p_dec
->fmt_out
.audio
.i_channels
= 0;
177 /* Set the faad config */
178 cfg
= faacDecGetCurrentConfiguration( p_sys
->hfaad
);
179 if (vlc_CPU() & CPU_CAPABILITY_FPU
)
180 cfg
->outputFormat
= FAAD_FMT_FLOAT
;
182 cfg
->outputFormat
= FAAD_FMT_16BIT
;
183 faacDecSetConfiguration( p_sys
->hfaad
, cfg
);
186 p_sys
->i_buffer
= p_sys
->i_buffer_size
= 0;
187 p_sys
->p_buffer
= NULL
;
189 /* Faad2 can't deal with truncated data (eg. from MPEG TS) */
190 p_dec
->b_need_packetized
= true;
192 p_sys
->b_sbr
= p_sys
->b_ps
= false;
196 /*****************************************************************************
198 *****************************************************************************/
199 static aout_buffer_t
*DecodeBlock( decoder_t
*p_dec
, block_t
**pp_block
)
201 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
204 if( !pp_block
|| !*pp_block
) return NULL
;
208 if( p_block
->i_flags
&(BLOCK_FLAG_DISCONTINUITY
|BLOCK_FLAG_CORRUPTED
) )
210 block_Release( p_block
);
214 /* Remove ADTS header if we have decoder specific config */
215 if( p_dec
->fmt_in
.i_extra
&& p_block
->i_buffer
> 7 )
217 if( p_block
->p_buffer
[0] == 0xff &&
218 ( p_block
->p_buffer
[1] & 0xf0 ) == 0xf0 ) /* syncword */
219 { /* ADTS header present */
220 size_t i_header_size
; /* 7 bytes (+ 2 bytes for crc) */
221 i_header_size
= 7 + ( ( p_block
->p_buffer
[1] & 0x01 ) ? 0 : 2 );
222 /* FIXME: multiple blocks per frame */
223 if( p_block
->i_buffer
> i_header_size
)
225 vlc_memcpy( p_block
->p_buffer
,
226 p_block
->p_buffer
+ i_header_size
,
227 p_block
->i_buffer
- i_header_size
);
228 p_block
->i_buffer
-= i_header_size
;
233 /* Append the block to the temporary buffer */
234 if( p_sys
->i_buffer_size
< p_sys
->i_buffer
+ p_block
->i_buffer
)
236 p_sys
->i_buffer_size
= p_sys
->i_buffer
+ p_block
->i_buffer
;
237 p_sys
->p_buffer
= realloc( p_sys
->p_buffer
, p_sys
->i_buffer_size
);
240 if( p_block
->i_buffer
> 0 )
242 vlc_memcpy( &p_sys
->p_buffer
[p_sys
->i_buffer
],
243 p_block
->p_buffer
, p_block
->i_buffer
);
244 p_sys
->i_buffer
+= p_block
->i_buffer
;
245 p_block
->i_buffer
= 0;
248 if( p_dec
->fmt_out
.audio
.i_rate
== 0 && p_dec
->fmt_in
.i_extra
> 0 )
250 /* We have a decoder config so init the handle */
251 unsigned long i_rate
;
252 unsigned char i_channels
;
254 if( faacDecInit2( p_sys
->hfaad
, p_dec
->fmt_in
.p_extra
,
255 p_dec
->fmt_in
.i_extra
,
256 &i_rate
, &i_channels
) >= 0 )
258 p_dec
->fmt_out
.audio
.i_rate
= i_rate
;
259 p_dec
->fmt_out
.audio
.i_channels
= i_channels
;
260 p_dec
->fmt_out
.audio
.i_physical_channels
261 = p_dec
->fmt_out
.audio
.i_original_channels
262 = pi_channels_guessed
[i_channels
];
264 aout_DateInit( &p_sys
->date
, i_rate
);
268 if( p_dec
->fmt_out
.audio
.i_rate
== 0 && p_sys
->i_buffer
)
270 unsigned long i_rate
;
271 unsigned char i_channels
;
273 /* Init faad with the first frame */
274 if( faacDecInit( p_sys
->hfaad
,
275 p_sys
->p_buffer
, p_sys
->i_buffer
,
276 &i_rate
, &i_channels
) < 0 )
278 block_Release( p_block
);
282 p_dec
->fmt_out
.audio
.i_rate
= i_rate
;
283 p_dec
->fmt_out
.audio
.i_channels
= i_channels
;
284 p_dec
->fmt_out
.audio
.i_physical_channels
285 = p_dec
->fmt_out
.audio
.i_original_channels
286 = pi_channels_guessed
[i_channels
];
287 aout_DateInit( &p_sys
->date
, i_rate
);
290 if( p_block
->i_pts
!= 0 && p_block
->i_pts
!= aout_DateGet( &p_sys
->date
) )
292 aout_DateSet( &p_sys
->date
, p_block
->i_pts
);
294 else if( !aout_DateGet( &p_sys
->date
) )
296 /* We've just started the stream, wait for the first PTS. */
297 block_Release( p_block
);
302 /* Decode all data */
303 if( p_sys
->i_buffer
)
306 faacDecFrameInfo frame
;
307 aout_buffer_t
*p_out
;
310 samples
= faacDecDecode( p_sys
->hfaad
, &frame
,
311 p_sys
->p_buffer
, p_sys
->i_buffer
);
313 if( frame
.error
> 0 )
315 msg_Warn( p_dec
, "%s", faacDecGetErrorMessage( frame
.error
) );
317 /* Flush the buffer */
319 block_Release( p_block
);
323 if( frame
.channels
<= 0 || frame
.channels
> 8 || frame
.channels
== 7 )
325 msg_Warn( p_dec
, "invalid channels count: %i", frame
.channels
);
327 /* Flush the buffer */
328 p_sys
->i_buffer
-= frame
.bytesconsumed
;
329 if( p_sys
->i_buffer
> 0 )
331 memmove( p_sys
->p_buffer
,&p_sys
->p_buffer
[frame
.bytesconsumed
],
334 block_Release( p_block
);
338 if( frame
.samples
<= 0 )
340 msg_Warn( p_dec
, "decoded zero sample" );
342 /* Flush the buffer */
343 p_sys
->i_buffer
-= frame
.bytesconsumed
;
344 if( p_sys
->i_buffer
> 0 )
346 memmove( p_sys
->p_buffer
,&p_sys
->p_buffer
[frame
.bytesconsumed
],
349 block_Release( p_block
);
353 /* We decoded a valid frame */
354 if( p_dec
->fmt_out
.audio
.i_rate
!= frame
.samplerate
)
356 aout_DateInit( &p_sys
->date
, frame
.samplerate
);
357 aout_DateSet( &p_sys
->date
, p_block
->i_pts
);
359 p_block
->i_pts
= 0; /* PTS is valid only once */
361 p_dec
->fmt_out
.audio
.i_rate
= frame
.samplerate
;
362 p_dec
->fmt_out
.audio
.i_channels
= frame
.channels
;
363 p_dec
->fmt_out
.audio
.i_physical_channels
364 = p_dec
->fmt_out
.audio
.i_original_channels
365 = pi_channels_guessed
[frame
.channels
];
367 /* Adjust stream info when dealing with SBR/PS */
368 if( (p_sys
->b_sbr
!= frame
.sbr
|| p_sys
->b_ps
!= frame
.ps
) &&
369 p_dec
->p_parent
->i_object_type
== VLC_OBJECT_INPUT
)
371 input_thread_t
*p_input
= (input_thread_t
*)p_dec
->p_parent
;
373 const char *psz_ext
= (frame
.sbr
&& frame
.ps
) ? "SBR+PS" :
374 frame
.sbr
? "SBR" : "PS";
376 msg_Dbg( p_dec
, "AAC %s (channels: %u, samplerate: %lu)",
377 psz_ext
, frame
.channels
, frame
.samplerate
);
379 if( asprintf( &psz_cat
, _("Stream %d"), p_dec
->fmt_in
.i_id
) != -1 )
381 input_Control( p_input
, INPUT_ADD_INFO
, psz_cat
,
382 _("AAC extension"), "%s", psz_ext
);
383 input_Control( p_input
, INPUT_ADD_INFO
, psz_cat
,
384 _("Channels"), "%d", frame
.channels
);
385 input_Control( p_input
, INPUT_ADD_INFO
, psz_cat
,
386 _("Sample rate"), _("%d Hz"), frame
.samplerate
);
389 p_sys
->b_sbr
= frame
.sbr
; p_sys
->b_ps
= frame
.ps
;
392 /* Convert frame.channel_position to our own channel values */
393 p_dec
->fmt_out
.audio
.i_physical_channels
= 0;
394 for( i
= 0; i
< frame
.channels
; i
++ )
396 /* Find the channel code */
397 for( j
= 0; j
< MAX_CHANNEL_POSITIONS
; j
++ )
399 if( frame
.channel_position
[i
] == pi_channels_in
[j
] )
402 if( j
>= MAX_CHANNEL_POSITIONS
)
404 msg_Warn( p_dec
, "unknown channel ordering" );
405 /* Invent something */
409 p_sys
->pi_channel_positions
[i
] = pi_channels_out
[j
];
410 if( p_dec
->fmt_out
.audio
.i_physical_channels
& pi_channels_out
[j
] )
411 frame
.channels
--; /* We loose a duplicated channel */
413 p_dec
->fmt_out
.audio
.i_physical_channels
|= pi_channels_out
[j
];
415 p_dec
->fmt_out
.audio
.i_original_channels
=
416 p_dec
->fmt_out
.audio
.i_physical_channels
;
418 p_out
= p_dec
->pf_aout_buffer_new(p_dec
, frame
.samples
/frame
.channels
);
422 block_Release( p_block
);
426 p_out
->start_date
= aout_DateGet( &p_sys
->date
);
427 p_out
->end_date
= aout_DateIncrement( &p_sys
->date
, frame
.samples
/ frame
.channels
);
429 DoReordering( (uint32_t *)p_out
->p_buffer
, samples
,
430 frame
.samples
/ frame
.channels
, frame
.channels
,
431 p_sys
->pi_channel_positions
);
433 p_sys
->i_buffer
-= frame
.bytesconsumed
;
434 if( p_sys
->i_buffer
> 0 )
436 memmove( p_sys
->p_buffer
, &p_sys
->p_buffer
[frame
.bytesconsumed
],
443 block_Release( p_block
);
447 /*****************************************************************************
449 *****************************************************************************/
450 static void Close( vlc_object_t
*p_this
)
452 decoder_t
*p_dec
= (decoder_t
*)p_this
;
453 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
455 faacDecClose( p_sys
->hfaad
);
456 free( p_sys
->p_buffer
);
460 /*****************************************************************************
461 * DoReordering: do some channel re-ordering (the ac3 channel order is
462 * different from the aac one).
463 *****************************************************************************/
464 static void DoReordering( uint32_t *p_out
, uint32_t *p_in
, int i_samples
,
465 int i_nb_channels
, uint32_t *pi_chan_positions
)
467 int pi_chan_table
[MAX_CHANNEL_POSITIONS
];
470 /* Find the channels mapping */
471 for( i
= 0, j
= 0; i
< MAX_CHANNEL_POSITIONS
; i
++ )
473 for( k
= 0; k
< i_nb_channels
; k
++ )
475 if( pi_channels_ordered
[i
] == pi_chan_positions
[k
] )
477 pi_chan_table
[k
] = j
++;
483 /* Do the actual reordering */
484 if( vlc_CPU() & CPU_CAPABILITY_FPU
)
485 for( i
= 0; i
< i_samples
; i
++ )
486 for( j
= 0; j
< i_nb_channels
; j
++ )
487 p_out
[i
* i_nb_channels
+ pi_chan_table
[j
]] =
488 p_in
[i
* i_nb_channels
+ j
];
490 for( i
= 0; i
< i_samples
; i
++ )
491 for( j
= 0; j
< i_nb_channels
; j
++ )
492 ((uint16_t *)p_out
)[i
* i_nb_channels
+ pi_chan_table
[j
]] =
493 ((uint16_t *)p_in
)[i
* i_nb_channels
+ j
];