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>
38 /*****************************************************************************
40 *****************************************************************************/
41 static int Open( vlc_object_t
* );
42 static void Close( vlc_object_t
* );
45 set_description( N_("AAC audio decoder (using libfaad2)") )
46 set_capability( "decoder", 100 )
47 set_category( CAT_INPUT
)
48 set_subcategory( SUBCAT_INPUT_ACODEC
)
49 set_callbacks( Open
, Close
)
52 /****************************************************************************
54 ****************************************************************************/
55 static aout_buffer_t
*DecodeBlock( decoder_t
*, block_t
** );
56 static void DoReordering( uint32_t *, uint32_t *, int, int, uint32_t * );
58 #define MAX_CHANNEL_POSITIONS 9
68 /* temporary buffer */
73 /* Channel positions of the current stream (for re-ordering) */
74 uint32_t pi_channel_positions
[MAX_CHANNEL_POSITIONS
];
79 static const uint32_t pi_channels_in
[MAX_CHANNEL_POSITIONS
] =
80 { FRONT_CHANNEL_CENTER
, FRONT_CHANNEL_LEFT
, FRONT_CHANNEL_RIGHT
,
81 SIDE_CHANNEL_LEFT
, SIDE_CHANNEL_RIGHT
,
82 BACK_CHANNEL_LEFT
, BACK_CHANNEL_RIGHT
,
83 BACK_CHANNEL_CENTER
, LFE_CHANNEL
};
84 static const uint32_t pi_channels_out
[MAX_CHANNEL_POSITIONS
] =
85 { AOUT_CHAN_CENTER
, AOUT_CHAN_LEFT
, AOUT_CHAN_RIGHT
,
86 AOUT_CHAN_MIDDLELEFT
, AOUT_CHAN_MIDDLERIGHT
,
87 AOUT_CHAN_REARLEFT
, AOUT_CHAN_REARRIGHT
,
88 AOUT_CHAN_REARCENTER
, AOUT_CHAN_LFE
};
89 static const uint32_t pi_channels_ordered
[MAX_CHANNEL_POSITIONS
] =
90 { AOUT_CHAN_LEFT
, AOUT_CHAN_RIGHT
,
91 AOUT_CHAN_MIDDLELEFT
, AOUT_CHAN_MIDDLERIGHT
,
92 AOUT_CHAN_REARLEFT
, AOUT_CHAN_REARRIGHT
,
93 AOUT_CHAN_CENTER
, AOUT_CHAN_REARCENTER
, AOUT_CHAN_LFE
95 static const uint32_t pi_channels_guessed
[MAX_CHANNEL_POSITIONS
] =
96 { 0, AOUT_CHAN_CENTER
, AOUT_CHAN_LEFT
| AOUT_CHAN_RIGHT
,
97 AOUT_CHAN_LEFT
| AOUT_CHAN_RIGHT
| AOUT_CHAN_LFE
,
98 AOUT_CHAN_LEFT
| AOUT_CHAN_RIGHT
| AOUT_CHAN_REARLEFT
99 | AOUT_CHAN_REARRIGHT
,
100 AOUT_CHAN_LEFT
| AOUT_CHAN_RIGHT
| AOUT_CHAN_REARLEFT
101 | AOUT_CHAN_REARRIGHT
| AOUT_CHAN_CENTER
,
102 AOUT_CHAN_LEFT
| AOUT_CHAN_RIGHT
| AOUT_CHAN_REARLEFT
103 | AOUT_CHAN_REARRIGHT
| AOUT_CHAN_CENTER
| AOUT_CHAN_LFE
,
104 AOUT_CHAN_LEFT
| AOUT_CHAN_RIGHT
| AOUT_CHAN_MIDDLELEFT
105 | AOUT_CHAN_MIDDLERIGHT
| AOUT_CHAN_REARLEFT
| AOUT_CHAN_REARRIGHT
107 AOUT_CHAN_LEFT
| AOUT_CHAN_RIGHT
| AOUT_CHAN_MIDDLELEFT
108 | AOUT_CHAN_MIDDLERIGHT
| AOUT_CHAN_REARLEFT
| AOUT_CHAN_REARRIGHT
109 | AOUT_CHAN_CENTER
| AOUT_CHAN_LFE
112 /*****************************************************************************
113 * OpenDecoder: probe the decoder and return score
114 *****************************************************************************/
115 static int Open( vlc_object_t
*p_this
)
117 decoder_t
*p_dec
= (decoder_t
*)p_this
;
118 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
119 faacDecConfiguration
*cfg
;
121 if( p_dec
->fmt_in
.i_codec
!= VLC_CODEC_MP4A
)
126 /* Allocate the memory needed to store the decoder's structure */
127 if( ( p_dec
->p_sys
= p_sys
= malloc( sizeof(*p_sys
) ) ) == NULL
)
130 /* Open a faad context */
131 if( ( p_sys
->hfaad
= faacDecOpen() ) == NULL
)
133 msg_Err( p_dec
, "cannot initialize faad" );
139 date_Set( &p_sys
->date
, 0 );
140 p_dec
->fmt_out
.i_cat
= AUDIO_ES
;
143 p_dec
->fmt_out
.i_codec
= VLC_CODEC_FL32
;
145 p_dec
->fmt_out
.i_codec
= VLC_CODEC_S16N
;
146 p_dec
->pf_decode_audio
= DecodeBlock
;
148 p_dec
->fmt_out
.audio
.i_physical_channels
=
149 p_dec
->fmt_out
.audio
.i_original_channels
= 0;
151 if( p_dec
->fmt_in
.i_extra
> 0 )
153 /* We have a decoder config so init the handle */
154 unsigned long i_rate
;
155 unsigned char i_channels
;
157 if( faacDecInit2( p_sys
->hfaad
, p_dec
->fmt_in
.p_extra
,
158 p_dec
->fmt_in
.i_extra
,
159 &i_rate
, &i_channels
) < 0 )
161 msg_Err( p_dec
, "Failed to initialize faad using extra data" );
162 faacDecClose( p_sys
->hfaad
);
167 p_dec
->fmt_out
.audio
.i_rate
= i_rate
;
168 p_dec
->fmt_out
.audio
.i_channels
= i_channels
;
169 p_dec
->fmt_out
.audio
.i_physical_channels
170 = p_dec
->fmt_out
.audio
.i_original_channels
171 = pi_channels_guessed
[i_channels
];
172 date_Init( &p_sys
->date
, i_rate
, 1 );
176 /* Will be initalised from first frame */
177 p_dec
->fmt_out
.audio
.i_rate
= 0;
178 p_dec
->fmt_out
.audio
.i_channels
= 0;
181 /* Set the faad config */
182 cfg
= faacDecGetCurrentConfiguration( p_sys
->hfaad
);
184 cfg
->outputFormat
= FAAD_FMT_FLOAT
;
186 cfg
->outputFormat
= FAAD_FMT_16BIT
;
187 faacDecSetConfiguration( p_sys
->hfaad
, cfg
);
190 p_sys
->i_buffer
= p_sys
->i_buffer_size
= 0;
191 p_sys
->p_buffer
= NULL
;
193 /* Faad2 can't deal with truncated data (eg. from MPEG TS) */
194 p_dec
->b_need_packetized
= true;
196 p_sys
->b_sbr
= p_sys
->b_ps
= false;
200 /*****************************************************************************
202 *****************************************************************************/
203 static aout_buffer_t
*DecodeBlock( decoder_t
*p_dec
, block_t
**pp_block
)
205 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
208 if( !pp_block
|| !*pp_block
) return NULL
;
212 if( p_block
->i_flags
&(BLOCK_FLAG_DISCONTINUITY
|BLOCK_FLAG_CORRUPTED
) )
214 block_Release( p_block
);
218 /* Remove ADTS header if we have decoder specific config */
219 if( p_dec
->fmt_in
.i_extra
&& p_block
->i_buffer
> 7 )
221 if( p_block
->p_buffer
[0] == 0xff &&
222 ( p_block
->p_buffer
[1] & 0xf0 ) == 0xf0 ) /* syncword */
223 { /* ADTS header present */
224 size_t i_header_size
; /* 7 bytes (+ 2 bytes for crc) */
225 i_header_size
= 7 + ( ( p_block
->p_buffer
[1] & 0x01 ) ? 0 : 2 );
226 /* FIXME: multiple blocks per frame */
227 if( p_block
->i_buffer
> i_header_size
)
229 p_block
->p_buffer
+= i_header_size
;
230 p_block
->i_buffer
-= i_header_size
;
235 /* Append the block to the temporary buffer */
236 if( p_sys
->i_buffer_size
< p_sys
->i_buffer
+ p_block
->i_buffer
)
238 size_t i_buffer_size
= p_sys
->i_buffer
+ p_block
->i_buffer
;
239 uint8_t *p_buffer
= realloc( p_sys
->p_buffer
, i_buffer_size
);
242 p_sys
->i_buffer_size
= i_buffer_size
;
243 p_sys
->p_buffer
= p_buffer
;
247 p_block
->i_buffer
= 0;
251 if( p_block
->i_buffer
> 0 )
253 vlc_memcpy( &p_sys
->p_buffer
[p_sys
->i_buffer
],
254 p_block
->p_buffer
, p_block
->i_buffer
);
255 p_sys
->i_buffer
+= p_block
->i_buffer
;
256 p_block
->i_buffer
= 0;
259 if( p_dec
->fmt_out
.audio
.i_rate
== 0 && p_dec
->fmt_in
.i_extra
> 0 )
261 /* We have a decoder config so init the handle */
262 unsigned long i_rate
;
263 unsigned char i_channels
;
265 if( faacDecInit2( p_sys
->hfaad
, p_dec
->fmt_in
.p_extra
,
266 p_dec
->fmt_in
.i_extra
,
267 &i_rate
, &i_channels
) >= 0 )
269 p_dec
->fmt_out
.audio
.i_rate
= i_rate
;
270 p_dec
->fmt_out
.audio
.i_channels
= i_channels
;
271 p_dec
->fmt_out
.audio
.i_physical_channels
272 = p_dec
->fmt_out
.audio
.i_original_channels
273 = pi_channels_guessed
[i_channels
];
275 date_Init( &p_sys
->date
, i_rate
, 1 );
279 if( p_dec
->fmt_out
.audio
.i_rate
== 0 && p_sys
->i_buffer
)
281 unsigned long i_rate
;
282 unsigned char i_channels
;
284 /* Init faad with the first frame */
285 if( faacDecInit( p_sys
->hfaad
,
286 p_sys
->p_buffer
, p_sys
->i_buffer
,
287 &i_rate
, &i_channels
) < 0 )
289 block_Release( p_block
);
293 p_dec
->fmt_out
.audio
.i_rate
= i_rate
;
294 p_dec
->fmt_out
.audio
.i_channels
= i_channels
;
295 p_dec
->fmt_out
.audio
.i_physical_channels
296 = p_dec
->fmt_out
.audio
.i_original_channels
297 = pi_channels_guessed
[i_channels
];
298 date_Init( &p_sys
->date
, i_rate
, 1 );
301 if( p_block
->i_pts
> VLC_TS_INVALID
&& p_block
->i_pts
!= date_Get( &p_sys
->date
) )
303 date_Set( &p_sys
->date
, p_block
->i_pts
);
305 else if( !date_Get( &p_sys
->date
) )
307 /* We've just started the stream, wait for the first PTS. */
308 block_Release( p_block
);
313 /* Decode all data */
314 if( p_sys
->i_buffer
)
317 faacDecFrameInfo frame
;
318 aout_buffer_t
*p_out
;
321 samples
= faacDecDecode( p_sys
->hfaad
, &frame
,
322 p_sys
->p_buffer
, p_sys
->i_buffer
);
324 if( frame
.error
> 0 )
326 msg_Warn( p_dec
, "%s", faacDecGetErrorMessage( frame
.error
) );
328 /* Flush the buffer */
330 block_Release( p_block
);
334 if( frame
.channels
<= 0 || frame
.channels
> 8 || frame
.channels
== 7 )
336 msg_Warn( p_dec
, "invalid channels count: %i", frame
.channels
);
338 /* Flush the buffer */
339 p_sys
->i_buffer
-= frame
.bytesconsumed
;
340 if( p_sys
->i_buffer
> 0 )
342 memmove( p_sys
->p_buffer
,&p_sys
->p_buffer
[frame
.bytesconsumed
],
345 block_Release( p_block
);
349 if( frame
.samples
<= 0 )
351 msg_Warn( p_dec
, "decoded zero sample" );
353 /* Flush the buffer */
354 p_sys
->i_buffer
-= frame
.bytesconsumed
;
355 if( p_sys
->i_buffer
> 0 )
357 memmove( p_sys
->p_buffer
,&p_sys
->p_buffer
[frame
.bytesconsumed
],
360 block_Release( p_block
);
364 /* We decoded a valid frame */
365 if( p_dec
->fmt_out
.audio
.i_rate
!= frame
.samplerate
)
367 date_Init( &p_sys
->date
, frame
.samplerate
, 1 );
368 date_Set( &p_sys
->date
, p_block
->i_pts
);
370 p_block
->i_pts
= VLC_TS_INVALID
; /* PTS is valid only once */
372 p_dec
->fmt_out
.audio
.i_rate
= frame
.samplerate
;
373 p_dec
->fmt_out
.audio
.i_channels
= frame
.channels
;
374 p_dec
->fmt_out
.audio
.i_physical_channels
375 = p_dec
->fmt_out
.audio
.i_original_channels
376 = pi_channels_guessed
[frame
.channels
];
378 /* Adjust stream info when dealing with SBR/PS */
379 bool b_sbr
= (frame
.sbr
== 1) || (frame
.sbr
== 2);
380 if( p_sys
->b_sbr
!= b_sbr
|| p_sys
->b_ps
!= frame
.ps
)
382 const char *psz_ext
= (b_sbr
&& frame
.ps
) ? "SBR+PS" :
383 b_sbr
? "SBR" : "PS";
385 msg_Dbg( p_dec
, "AAC %s (channels: %u, samplerate: %lu)",
386 psz_ext
, frame
.channels
, frame
.samplerate
);
388 if( !p_dec
->p_description
)
389 p_dec
->p_description
= vlc_meta_New();
390 if( p_dec
->p_description
)
391 vlc_meta_AddExtra( p_dec
->p_description
, _("AAC extension"), psz_ext
);
393 p_sys
->b_sbr
= b_sbr
;
394 p_sys
->b_ps
= frame
.ps
;
397 /* Convert frame.channel_position to our own channel values */
398 p_dec
->fmt_out
.audio
.i_physical_channels
= 0;
399 for( i
= 0; i
< frame
.channels
; i
++ )
401 /* Find the channel code */
402 for( j
= 0; j
< MAX_CHANNEL_POSITIONS
; j
++ )
404 if( frame
.channel_position
[i
] == pi_channels_in
[j
] )
407 if( j
>= MAX_CHANNEL_POSITIONS
)
409 msg_Warn( p_dec
, "unknown channel ordering" );
410 /* Invent something */
414 p_sys
->pi_channel_positions
[i
] = pi_channels_out
[j
];
415 if( p_dec
->fmt_out
.audio
.i_physical_channels
& pi_channels_out
[j
] )
416 frame
.channels
--; /* We loose a duplicated channel */
418 p_dec
->fmt_out
.audio
.i_physical_channels
|= pi_channels_out
[j
];
420 p_dec
->fmt_out
.audio
.i_original_channels
=
421 p_dec
->fmt_out
.audio
.i_physical_channels
;
423 p_out
= decoder_NewAudioBuffer(p_dec
, frame
.samples
/frame
.channels
);
427 block_Release( p_block
);
431 p_out
->i_pts
= date_Get( &p_sys
->date
);
432 p_out
->i_length
= date_Increment( &p_sys
->date
,
433 frame
.samples
/ frame
.channels
)
436 DoReordering( (uint32_t *)p_out
->p_buffer
, samples
,
437 frame
.samples
/ frame
.channels
, frame
.channels
,
438 p_sys
->pi_channel_positions
);
440 p_sys
->i_buffer
-= frame
.bytesconsumed
;
441 if( p_sys
->i_buffer
> 0 )
443 memmove( p_sys
->p_buffer
, &p_sys
->p_buffer
[frame
.bytesconsumed
],
450 block_Release( p_block
);
454 /*****************************************************************************
456 *****************************************************************************/
457 static void Close( vlc_object_t
*p_this
)
459 decoder_t
*p_dec
= (decoder_t
*)p_this
;
460 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
462 faacDecClose( p_sys
->hfaad
);
463 free( p_sys
->p_buffer
);
467 /*****************************************************************************
468 * DoReordering: do some channel re-ordering (the ac3 channel order is
469 * different from the aac one).
470 *****************************************************************************/
471 static void DoReordering( uint32_t *p_out
, uint32_t *p_in
, int i_samples
,
472 int i_nb_channels
, uint32_t *pi_chan_positions
)
474 int pi_chan_table
[MAX_CHANNEL_POSITIONS
];
477 /* Find the channels mapping */
478 for( i
= 0, j
= 0; i
< MAX_CHANNEL_POSITIONS
; i
++ )
480 for( k
= 0; k
< i_nb_channels
; k
++ )
482 if( pi_channels_ordered
[i
] == pi_chan_positions
[k
] )
484 pi_chan_table
[k
] = j
++;
490 /* Do the actual reordering */
492 for( i
= 0; i
< i_samples
; i
++ )
493 for( j
= 0; j
< i_nb_channels
; j
++ )
494 p_out
[i
* i_nb_channels
+ pi_chan_table
[j
]] =
495 p_in
[i
* i_nb_channels
+ j
];
497 for( i
= 0; i
< i_samples
; i
++ )
498 for( j
= 0; j
< i_nb_channels
; j
++ )
499 ((uint16_t *)p_out
)[i
* i_nb_channels
+ pi_chan_table
[j
]] =
500 ((uint16_t *)p_in
)[i
* i_nb_channels
+ j
];