]> git.sesse.net Git - vlc/blob - modules/codec/avcodec/audio.c
920ed22a73f3581b7f31d85b666db2d853701ab9
[vlc] / modules / codec / avcodec / audio.c
1 /*****************************************************************************
2  * audio.c: audio decoder using ffmpeg library
3  *****************************************************************************
4  * Copyright (C) 1999-2003 the VideoLAN team
5  * $Id$
6  *
7  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
8  *          Gildas Bazin <gbazin@videolan.org>
9  *
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.
14  *
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.
19  *
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  *****************************************************************************/
24
25 /*****************************************************************************
26  * Preamble
27  *****************************************************************************/
28 #ifdef HAVE_CONFIG_H
29 # include "config.h"
30 #endif
31
32 #include <vlc_common.h>
33 #include <vlc_aout.h>
34 #include <vlc_codec.h>
35 #include <vlc_avcodec.h>
36
37 /* ffmpeg header */
38 #ifdef HAVE_LIBAVCODEC_AVCODEC_H
39 #   include <libavcodec/avcodec.h>
40 #elif defined(HAVE_FFMPEG_AVCODEC_H)
41 #   include <ffmpeg/avcodec.h>
42 #else
43 #   include <avcodec.h>
44 #endif
45
46 #include "avcodec.h"
47
48 /*****************************************************************************
49  * decoder_sys_t : decoder descriptor
50  *****************************************************************************/
51 struct decoder_sys_t
52 {
53     FFMPEG_COMMON_MEMBERS
54
55     /* Temporary buffer for libavcodec */
56     int     i_output_max;
57     uint8_t *p_output;
58
59     /*
60      * Output properties
61      */
62     audio_sample_format_t aout_format;
63     date_t                end_date;
64
65     /*
66      *
67      */
68     uint8_t *p_samples;
69     int     i_samples;
70
71     /* */
72     int     i_reject_count;
73
74     /* */
75     bool    b_extract;
76     int     pi_extraction[AOUT_CHAN_MAX];
77     int     i_previous_channels;
78     int64_t i_previous_layout;
79 };
80
81 #define BLOCK_FLAG_PRIVATE_REALLOCATED (1 << BLOCK_FLAG_PRIVATE_SHIFT)
82
83 static void SetupOutputFormat( decoder_t *p_dec, bool b_trust );
84
85 /*****************************************************************************
86  * InitAudioDec: initialize audio decoder
87  *****************************************************************************
88  * The ffmpeg codec will be opened, some memory allocated.
89  *****************************************************************************/
90 int InitAudioDec( decoder_t *p_dec, AVCodecContext *p_context,
91                       AVCodec *p_codec, int i_codec_id, const char *psz_namecodec )
92 {
93     decoder_sys_t *p_sys;
94
95     /* Allocate the memory needed to store the decoder's structure */
96     if( ( p_dec->p_sys = p_sys = malloc(sizeof(*p_sys)) ) == NULL )
97     {
98         return VLC_ENOMEM;
99     }
100
101     p_codec->type = CODEC_TYPE_AUDIO;
102     p_context->codec_type = CODEC_TYPE_AUDIO;
103     p_context->codec_id = i_codec_id;
104     p_sys->p_context = p_context;
105     p_sys->p_codec = p_codec;
106     p_sys->i_codec_id = i_codec_id;
107     p_sys->psz_namecodec = psz_namecodec;
108     p_sys->b_delayed_open = false;
109
110     /* ***** Fill p_context with init values ***** */
111     p_sys->p_context->sample_rate = p_dec->fmt_in.audio.i_rate;
112     p_sys->p_context->channels = p_dec->fmt_in.audio.i_channels;
113
114     p_sys->p_context->block_align = p_dec->fmt_in.audio.i_blockalign;
115     p_sys->p_context->bit_rate = p_dec->fmt_in.i_bitrate;
116     p_sys->p_context->bits_per_coded_sample = p_dec->fmt_in.audio.i_bitspersample;
117
118     if( p_dec->fmt_in.i_extra > 0 )
119     {
120         const uint8_t * const p_src = p_dec->fmt_in.p_extra;
121         int i_offset;
122         int i_size;
123
124         if( p_dec->fmt_in.i_codec == VLC_CODEC_FLAC )
125         {
126             i_offset = 8;
127             i_size = p_dec->fmt_in.i_extra - 8;
128         }
129         else if( p_dec->fmt_in.i_codec == VLC_CODEC_ALAC )
130         {
131             static const uint8_t p_pattern[] = { 0, 0, 0, 36, 'a', 'l', 'a', 'c' };
132             /* Find alac atom XXX it is a bit ugly */
133             for( i_offset = 0; i_offset < p_dec->fmt_in.i_extra - sizeof(p_pattern); i_offset++ )
134             {
135                 if( !memcmp( &p_src[i_offset], p_pattern, sizeof(p_pattern) ) )
136                     break;
137             }
138             i_size = __MIN( p_dec->fmt_in.i_extra - i_offset, 36 );
139             if( i_size < 36 )
140                 i_size = 0;
141         }
142         else
143         {
144             i_offset = 0;
145             i_size = p_dec->fmt_in.i_extra;
146         }
147
148         if( i_size > 0 )
149         {
150             p_sys->p_context->extradata =
151                 malloc( i_size + FF_INPUT_BUFFER_PADDING_SIZE );
152             if( p_sys->p_context->extradata )
153             {
154                 uint8_t *p_dst = p_sys->p_context->extradata;
155
156                 p_sys->p_context->extradata_size = i_size;
157
158                 memcpy( &p_dst[0],            &p_src[i_offset], i_size );
159                 memset( &p_dst[i_size], 0, FF_INPUT_BUFFER_PADDING_SIZE );
160             }
161         }
162     }
163     else
164     {
165         p_sys->p_context->extradata_size = 0;
166         p_sys->p_context->extradata = NULL;
167     }
168
169     /* ***** Open the codec ***** */
170     int ret;
171     vlc_avcodec_lock();
172     ret = avcodec_open( p_sys->p_context, p_sys->p_codec );
173     vlc_avcodec_unlock();
174     if( ret < 0 )
175     {
176         msg_Err( p_dec, "cannot open codec (%s)", p_sys->psz_namecodec );
177         free( p_sys->p_context->extradata );
178         free( p_sys );
179         return VLC_EGENERIC;
180     }
181
182     msg_Dbg( p_dec, "ffmpeg codec (%s) started", p_sys->psz_namecodec );
183
184     switch( i_codec_id )
185     {
186     case CODEC_ID_WAVPACK:
187         p_sys->i_output_max = 8 * sizeof(int32_t) * 131072;
188         break;
189     case CODEC_ID_TTA:
190         p_sys->i_output_max = p_sys->p_context->channels * sizeof(int32_t) * p_sys->p_context->sample_rate * 2;
191         break;
192     case CODEC_ID_FLAC:
193         p_sys->i_output_max = 8 * sizeof(int32_t) * 65535;
194         break;
195 #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT( 52, 35, 0 )
196     case CODEC_ID_WMAPRO:
197         p_sys->i_output_max = 8 * sizeof(float) * 6144; /* (1 << 12) * 3/2 */
198         break;
199 #endif
200     default:
201         p_sys->i_output_max = 0;
202         break;
203     }
204     if( p_sys->i_output_max < AVCODEC_MAX_AUDIO_FRAME_SIZE )
205         p_sys->i_output_max = AVCODEC_MAX_AUDIO_FRAME_SIZE;
206     msg_Dbg( p_dec, "Using %d bytes output buffer", p_sys->i_output_max );
207     p_sys->p_output = av_malloc( p_sys->i_output_max );
208
209     p_sys->p_samples = NULL;
210     p_sys->i_samples = 0;
211     p_sys->i_reject_count = 0;
212     p_sys->b_extract = false;
213     p_sys->i_previous_channels = 0;
214     p_sys->i_previous_layout = 0;
215
216     /* */
217     p_dec->fmt_out.i_cat = AUDIO_ES;
218     /* Try to set as much informations as possible but do not trust it */
219     SetupOutputFormat( p_dec, false );
220
221     date_Set( &p_sys->end_date, 0 );
222     if( p_dec->fmt_out.audio.i_rate )
223         date_Init( &p_sys->end_date, p_dec->fmt_out.audio.i_rate, 1 );
224     else if( p_dec->fmt_in.audio.i_rate )
225         date_Init( &p_sys->end_date, p_dec->fmt_in.audio.i_rate, 1 );
226
227     return VLC_SUCCESS;
228 }
229
230 /*****************************************************************************
231  * SplitBuffer: Needed because aout really doesn't like big audio chunk and
232  * wma produces easily > 30000 samples...
233  *****************************************************************************/
234 static aout_buffer_t *SplitBuffer( decoder_t *p_dec )
235 {
236     decoder_sys_t *p_sys = p_dec->p_sys;
237     int i_samples = __MIN( p_sys->i_samples, 4096 );
238     aout_buffer_t *p_buffer;
239
240     if( i_samples == 0 ) return NULL;
241
242     if( ( p_buffer = decoder_NewAudioBuffer( p_dec, i_samples ) ) == NULL )
243         return NULL;
244
245     p_buffer->i_pts = date_Get( &p_sys->end_date );
246     p_buffer->i_length = date_Increment( &p_sys->end_date, i_samples )
247                          - p_buffer->i_pts;
248
249     if( p_sys->b_extract )
250         aout_ChannelExtract( p_buffer->p_buffer, p_dec->fmt_out.audio.i_channels,
251                              p_sys->p_samples, p_sys->p_context->channels, i_samples,
252                              p_sys->pi_extraction, p_dec->fmt_out.audio.i_bitspersample );
253     else
254         memcpy( p_buffer->p_buffer, p_sys->p_samples, p_buffer->i_buffer );
255
256     p_sys->p_samples += i_samples * p_sys->p_context->channels * ( p_dec->fmt_out.audio.i_bitspersample / 8 );
257     p_sys->i_samples -= i_samples;
258
259     return p_buffer;
260 }
261
262 /*****************************************************************************
263  * DecodeAudio: Called to decode one frame
264  *****************************************************************************/
265 aout_buffer_t * DecodeAudio ( decoder_t *p_dec, block_t **pp_block )
266 {
267     decoder_sys_t *p_sys = p_dec->p_sys;
268     int i_used, i_output;
269     aout_buffer_t *p_buffer;
270     block_t *p_block;
271
272     if( !pp_block || !*pp_block ) return NULL;
273
274     p_block = *pp_block;
275
276     if( p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
277     {
278         block_Release( p_block );
279         avcodec_flush_buffers( p_sys->p_context );
280         p_sys->i_samples = 0;
281         date_Set( &p_sys->end_date, 0 );
282
283         if( p_sys->i_codec_id == CODEC_ID_MP2 || p_sys->i_codec_id == CODEC_ID_MP3 )
284             p_sys->i_reject_count = 3;
285         return NULL;
286     }
287
288     if( p_sys->i_samples > 0 )
289     {
290         /* More data */
291         p_buffer = SplitBuffer( p_dec );
292         if( !p_buffer ) block_Release( p_block );
293         return p_buffer;
294     }
295
296     if( !date_Get( &p_sys->end_date ) && !p_block->i_pts )
297     {
298         /* We've just started the stream, wait for the first PTS. */
299         block_Release( p_block );
300         return NULL;
301     }
302
303     if( p_block->i_buffer <= 0 )
304     {
305         block_Release( p_block );
306         return NULL;
307     }
308
309     if( (p_block->i_flags & BLOCK_FLAG_PRIVATE_REALLOCATED) == 0 )
310     {
311         *pp_block = p_block = block_Realloc( p_block, 0, p_block->i_buffer + FF_INPUT_BUFFER_PADDING_SIZE );
312         if( !p_block )
313             return NULL;
314         p_block->i_buffer -= FF_INPUT_BUFFER_PADDING_SIZE;
315         memset( &p_block->p_buffer[p_block->i_buffer], 0, FF_INPUT_BUFFER_PADDING_SIZE );
316
317         p_block->i_flags |= BLOCK_FLAG_PRIVATE_REALLOCATED;
318     }
319
320     do
321     {
322         i_output = __MAX( p_block->i_buffer, p_sys->i_output_max );
323         if( i_output > p_sys->i_output_max )
324         {
325             /* Grow output buffer if necessary (eg. for PCM data) */
326             p_sys->p_output = av_realloc( p_sys->p_output, i_output );
327         }
328
329         i_used = avcodec_decode_audio2( p_sys->p_context,
330                                        (int16_t*)p_sys->p_output, &i_output,
331                                        p_block->p_buffer, p_block->i_buffer );
332
333         if( i_used < 0 || i_output < 0 )
334         {
335             if( i_used < 0 )
336                 msg_Warn( p_dec, "cannot decode one frame (%zu bytes)",
337                           p_block->i_buffer );
338
339             block_Release( p_block );
340             return NULL;
341         }
342         else if( (size_t)i_used > p_block->i_buffer )
343         {
344             i_used = p_block->i_buffer;
345         }
346
347         p_block->i_buffer -= i_used;
348         p_block->p_buffer += i_used;
349
350     } while( p_block->i_buffer > 0 && i_output <= 0 );
351
352     if( p_sys->p_context->channels <= 0 || p_sys->p_context->channels > 8 ||
353         p_sys->p_context->sample_rate <= 0 )
354     {
355         msg_Warn( p_dec, "invalid audio properties channels count %d, sample rate %d",
356                   p_sys->p_context->channels, p_sys->p_context->sample_rate );
357         block_Release( p_block );
358         return NULL;
359     }
360
361     if( p_dec->fmt_out.audio.i_rate != (unsigned int)p_sys->p_context->sample_rate )
362     {
363         date_Init( &p_sys->end_date, p_sys->p_context->sample_rate, 1 );
364         date_Set( &p_sys->end_date, p_block->i_pts );
365     }
366
367     /* **** Set audio output parameters **** */
368     SetupOutputFormat( p_dec, true );
369
370     if( p_block->i_pts != 0 &&
371         p_block->i_pts != date_Get( &p_sys->end_date ) )
372     {
373         date_Set( &p_sys->end_date, p_block->i_pts );
374     }
375     p_block->i_pts = 0;
376
377     /* **** Now we can output these samples **** */
378     p_sys->i_samples = i_output / (p_dec->fmt_out.audio.i_bitspersample / 8) / p_sys->p_context->channels;
379     p_sys->p_samples = p_sys->p_output;
380
381     /* Silent unwanted samples */
382     if( p_sys->i_reject_count > 0 )
383     {
384         memset( p_sys->p_output, 0, i_output );
385         p_sys->i_reject_count--;
386     }
387
388     p_buffer = SplitBuffer( p_dec );
389     if( !p_buffer ) block_Release( p_block );
390     return p_buffer;
391 }
392
393 /*****************************************************************************
394  * EndAudioDec: audio decoder destruction
395  *****************************************************************************/
396 void EndAudioDec( decoder_t *p_dec )
397 {
398     decoder_sys_t *p_sys = p_dec->p_sys;
399
400     av_free( p_sys->p_output );
401 }
402
403 /*****************************************************************************
404  *
405  *****************************************************************************/
406
407 void GetVlcAudioFormat( vlc_fourcc_t *pi_codec, unsigned *pi_bits, int i_sample_fmt )
408 {
409     switch( i_sample_fmt )
410     {
411     case SAMPLE_FMT_U8:
412         *pi_codec = VLC_CODEC_U8;
413         *pi_bits = 8;
414         break;
415     case SAMPLE_FMT_S32:
416         *pi_codec = VLC_CODEC_S32N;
417         *pi_bits = 32;
418         break;
419     case SAMPLE_FMT_FLT:
420         *pi_codec = VLC_CODEC_FL32;
421         *pi_bits = 32;
422         break;
423     case SAMPLE_FMT_DBL:
424         *pi_codec = VLC_CODEC_FL64;
425         *pi_bits = 64;
426         break;
427
428     case SAMPLE_FMT_S16:
429     default:
430         *pi_codec = VLC_CODEC_S16N;
431         *pi_bits = 16;
432         break;
433     }
434 }
435
436 static const uint64_t pi_channels_map[][2] =
437 {
438     { CH_FRONT_LEFT,        AOUT_CHAN_LEFT },
439     { CH_FRONT_RIGHT,       AOUT_CHAN_RIGHT },
440     { CH_FRONT_CENTER,      AOUT_CHAN_CENTER },
441     { CH_LOW_FREQUENCY,     AOUT_CHAN_LFE },
442     { CH_BACK_LEFT,         AOUT_CHAN_REARLEFT },
443     { CH_BACK_RIGHT,        AOUT_CHAN_REARRIGHT },
444     { CH_FRONT_LEFT_OF_CENTER, 0 },
445     { CH_FRONT_RIGHT_OF_CENTER, 0 },
446     { CH_BACK_CENTER,       AOUT_CHAN_REARCENTER },
447     { CH_SIDE_LEFT,         AOUT_CHAN_MIDDLELEFT },
448     { CH_SIDE_RIGHT,        AOUT_CHAN_MIDDLERIGHT },
449     { CH_TOP_CENTER,        0 },
450     { CH_TOP_FRONT_LEFT,    0 },
451     { CH_TOP_FRONT_CENTER,  0 },
452     { CH_TOP_FRONT_RIGHT,   0 },
453     { CH_TOP_BACK_LEFT,     0 },
454     { CH_TOP_BACK_CENTER,   0 },
455     { CH_TOP_BACK_RIGHT,    0 },
456     { CH_STEREO_LEFT,       0 },
457     { CH_STEREO_RIGHT,      0 },
458 };
459
460 static void SetupOutputFormat( decoder_t *p_dec, bool b_trust )
461 {
462     decoder_sys_t *p_sys = p_dec->p_sys;
463
464     GetVlcAudioFormat( &p_dec->fmt_out.i_codec,
465                        &p_dec->fmt_out.audio.i_bitspersample,
466                        p_sys->p_context->sample_fmt );
467     p_dec->fmt_out.audio.i_rate = p_sys->p_context->sample_rate;
468
469     /* */
470     if( p_sys->i_previous_channels == p_sys->p_context->channels &&
471         p_sys->i_previous_layout == p_sys->p_context->channel_layout )
472         return;
473     if( b_trust )
474     {
475         p_sys->i_previous_channels = p_sys->p_context->channels;
476         p_sys->i_previous_layout = p_sys->p_context->channel_layout;
477     }
478
479     /* Specified order
480      * FIXME should we use fmt_in.audio.i_physical_channels or not ?
481      */
482     const unsigned i_order_max = 8 * sizeof(p_sys->p_context->channel_layout);
483     uint32_t pi_order_src[i_order_max];
484     int i_channels_src = 0;
485
486     if( p_sys->p_context->channel_layout )
487     {
488         for( unsigned i = 0; i < sizeof(pi_channels_map)/sizeof(*pi_channels_map); i++ )
489         {
490             if( p_sys->p_context->channel_layout & pi_channels_map[i][0] )
491                 pi_order_src[i_channels_src++] = pi_channels_map[i][1];
492         }
493     }
494     else
495     {
496         /* Create default order  */
497         if( b_trust )
498             msg_Warn( p_dec, "Physical channel configuration not set : guessing" );
499         for( unsigned int i = 0; i < __MIN( i_order_max, (unsigned)p_sys->p_context->channels ); i++ )
500         {
501             if( i < sizeof(pi_channels_map)/sizeof(*pi_channels_map) )
502                 pi_order_src[i_channels_src++] = pi_channels_map[i][1];
503         }
504     }
505     if( i_channels_src != p_sys->p_context->channels && b_trust )
506         msg_Err( p_dec, "Channel layout not understood" );
507
508     uint32_t i_layout_dst;
509     int      i_channels_dst;
510     p_sys->b_extract = aout_CheckChannelExtraction( p_sys->pi_extraction,
511                                                     &i_layout_dst, &i_channels_dst,
512                                                     NULL, pi_order_src, i_channels_src );
513     if( i_channels_dst != i_channels_src && b_trust )
514         msg_Warn( p_dec, "%d channels are dropped", i_channels_src - i_channels_dst );
515
516     p_dec->fmt_out.audio.i_physical_channels =
517     p_dec->fmt_out.audio.i_original_channels = i_layout_dst;
518     p_dec->fmt_out.audio.i_channels = i_channels_dst;
519 }
520