1 /*****************************************************************************
2 * audio.c: audio decoder using ffmpeg library
3 *****************************************************************************
4 * Copyright (C) 1999-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 *****************************************************************************/
25 /*****************************************************************************
27 *****************************************************************************/
32 #include <vlc_common.h>
34 #include <vlc_codec.h>
35 #include <vlc_avcodec.h>
38 #ifdef HAVE_LIBAVCODEC_AVCODEC_H
39 # include <libavcodec/avcodec.h>
46 /*****************************************************************************
47 * decoder_sys_t : decoder descriptor
48 *****************************************************************************/
51 AVCODEC_COMMON_MEMBERS
53 /* Temporary buffer for libavcodec */
60 audio_sample_format_t aout_format
;
74 int pi_extraction
[AOUT_CHAN_MAX
];
75 int i_previous_channels
;
76 int64_t i_previous_layout
;
79 #define BLOCK_FLAG_PRIVATE_REALLOCATED (1 << BLOCK_FLAG_PRIVATE_SHIFT)
81 static void SetupOutputFormat( decoder_t
*p_dec
, bool b_trust
);
83 static void InitDecoderConfig( decoder_t
*p_dec
, AVCodecContext
*p_context
)
85 if( p_dec
->fmt_in
.i_extra
> 0 )
87 const uint8_t * const p_src
= p_dec
->fmt_in
.p_extra
;
91 if( p_dec
->fmt_in
.i_codec
== VLC_CODEC_FLAC
)
94 i_size
= p_dec
->fmt_in
.i_extra
- 8;
96 else if( p_dec
->fmt_in
.i_codec
== VLC_CODEC_ALAC
)
98 static const uint8_t p_pattern
[] = { 0, 0, 0, 36, 'a', 'l', 'a', 'c' };
99 /* Find alac atom XXX it is a bit ugly */
100 for( i_offset
= 0; i_offset
< p_dec
->fmt_in
.i_extra
- sizeof(p_pattern
); i_offset
++ )
102 if( !memcmp( &p_src
[i_offset
], p_pattern
, sizeof(p_pattern
) ) )
105 i_size
= __MIN( p_dec
->fmt_in
.i_extra
- i_offset
, 36 );
112 i_size
= p_dec
->fmt_in
.i_extra
;
117 p_context
->extradata
=
118 malloc( i_size
+ FF_INPUT_BUFFER_PADDING_SIZE
);
119 if( p_context
->extradata
)
121 uint8_t *p_dst
= p_context
->extradata
;
123 p_context
->extradata_size
= i_size
;
125 memcpy( &p_dst
[0], &p_src
[i_offset
], i_size
);
126 memset( &p_dst
[i_size
], 0, FF_INPUT_BUFFER_PADDING_SIZE
);
132 p_context
->extradata_size
= 0;
133 p_context
->extradata
= NULL
;
137 /*****************************************************************************
138 * InitAudioDec: initialize audio decoder
139 *****************************************************************************
140 * The ffmpeg codec will be opened, some memory allocated.
141 *****************************************************************************/
142 int InitAudioDec( decoder_t
*p_dec
, AVCodecContext
*p_context
,
143 AVCodec
*p_codec
, int i_codec_id
, const char *psz_namecodec
)
145 decoder_sys_t
*p_sys
;
147 /* Allocate the memory needed to store the decoder's structure */
148 if( ( p_dec
->p_sys
= p_sys
= malloc(sizeof(*p_sys
)) ) == NULL
)
153 p_codec
->type
= AVMEDIA_TYPE_AUDIO
;
154 p_context
->codec_type
= AVMEDIA_TYPE_AUDIO
;
155 p_context
->codec_id
= i_codec_id
;
156 p_sys
->p_context
= p_context
;
157 p_sys
->p_codec
= p_codec
;
158 p_sys
->i_codec_id
= i_codec_id
;
159 p_sys
->psz_namecodec
= psz_namecodec
;
160 p_sys
->b_delayed_open
= true;
162 // Initialize decoder extradata
163 InitDecoderConfig( p_dec
, p_context
);
165 /* ***** Open the codec ***** */
166 if( ffmpeg_OpenCodec( p_dec
) < 0 )
168 msg_Err( p_dec
, "cannot open codec (%s)", p_sys
->psz_namecodec
);
169 free( p_sys
->p_context
->extradata
);
176 case CODEC_ID_WAVPACK
:
177 p_sys
->i_output_max
= 8 * sizeof(int32_t) * 131072;
180 p_sys
->i_output_max
= p_sys
->p_context
->channels
* sizeof(int32_t) * p_sys
->p_context
->sample_rate
* 2;
183 p_sys
->i_output_max
= 8 * sizeof(int32_t) * 65535;
185 #if LIBAVCODEC_VERSION_INT >= AV_VERSION_INT( 52, 35, 0 )
186 case CODEC_ID_WMAPRO
:
187 p_sys
->i_output_max
= 8 * sizeof(float) * 6144; /* (1 << 12) * 3/2 */
191 p_sys
->i_output_max
= 0;
194 if( p_sys
->i_output_max
< AVCODEC_MAX_AUDIO_FRAME_SIZE
)
195 p_sys
->i_output_max
= AVCODEC_MAX_AUDIO_FRAME_SIZE
;
196 msg_Dbg( p_dec
, "Using %d bytes output buffer", p_sys
->i_output_max
);
197 p_sys
->p_output
= av_malloc( p_sys
->i_output_max
);
199 p_sys
->p_samples
= NULL
;
200 p_sys
->i_samples
= 0;
201 p_sys
->i_reject_count
= 0;
202 p_sys
->b_extract
= false;
203 p_sys
->i_previous_channels
= 0;
204 p_sys
->i_previous_layout
= 0;
207 p_dec
->fmt_out
.i_cat
= AUDIO_ES
;
208 /* Try to set as much information as possible but do not trust it */
209 SetupOutputFormat( p_dec
, false );
211 date_Set( &p_sys
->end_date
, 0 );
212 if( p_dec
->fmt_out
.audio
.i_rate
)
213 date_Init( &p_sys
->end_date
, p_dec
->fmt_out
.audio
.i_rate
, 1 );
214 else if( p_dec
->fmt_in
.audio
.i_rate
)
215 date_Init( &p_sys
->end_date
, p_dec
->fmt_in
.audio
.i_rate
, 1 );
220 /*****************************************************************************
221 * SplitBuffer: Needed because aout really doesn't like big audio chunk and
222 * wma produces easily > 30000 samples...
223 *****************************************************************************/
224 static aout_buffer_t
*SplitBuffer( decoder_t
*p_dec
)
226 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
227 int i_samples
= __MIN( p_sys
->i_samples
, 4096 );
228 aout_buffer_t
*p_buffer
;
230 if( i_samples
== 0 ) return NULL
;
232 if( ( p_buffer
= decoder_NewAudioBuffer( p_dec
, i_samples
) ) == NULL
)
235 p_buffer
->i_pts
= date_Get( &p_sys
->end_date
);
236 p_buffer
->i_length
= date_Increment( &p_sys
->end_date
, i_samples
)
239 if( p_sys
->b_extract
)
240 aout_ChannelExtract( p_buffer
->p_buffer
, p_dec
->fmt_out
.audio
.i_channels
,
241 p_sys
->p_samples
, p_sys
->p_context
->channels
, i_samples
,
242 p_sys
->pi_extraction
, p_dec
->fmt_out
.audio
.i_bitspersample
);
244 memcpy( p_buffer
->p_buffer
, p_sys
->p_samples
, p_buffer
->i_buffer
);
246 p_sys
->p_samples
+= i_samples
* p_sys
->p_context
->channels
* ( p_dec
->fmt_out
.audio
.i_bitspersample
/ 8 );
247 p_sys
->i_samples
-= i_samples
;
252 /*****************************************************************************
253 * DecodeAudio: Called to decode one frame
254 *****************************************************************************/
255 aout_buffer_t
* DecodeAudio ( decoder_t
*p_dec
, block_t
**pp_block
)
257 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
258 int i_used
, i_output
;
259 aout_buffer_t
*p_buffer
;
263 if( !pp_block
|| !*pp_block
) return NULL
;
267 if( !p_sys
->p_context
->extradata_size
&& p_dec
->fmt_in
.i_extra
&&
268 p_sys
->b_delayed_open
)
270 InitDecoderConfig( p_dec
, p_sys
->p_context
);
271 if( ffmpeg_OpenCodec( p_dec
) )
272 msg_Err( p_dec
, "Cannot open decoder %s", p_sys
->psz_namecodec
);
274 if( p_sys
->b_delayed_open
)
276 block_Release( p_block
);
280 if( p_block
->i_flags
& (BLOCK_FLAG_DISCONTINUITY
|BLOCK_FLAG_CORRUPTED
) )
282 block_Release( p_block
);
283 avcodec_flush_buffers( p_sys
->p_context
);
284 p_sys
->i_samples
= 0;
285 date_Set( &p_sys
->end_date
, 0 );
287 if( p_sys
->i_codec_id
== CODEC_ID_MP2
|| p_sys
->i_codec_id
== CODEC_ID_MP3
)
288 p_sys
->i_reject_count
= 3;
292 if( p_sys
->i_samples
> 0 )
295 p_buffer
= SplitBuffer( p_dec
);
296 if( !p_buffer
) block_Release( p_block
);
300 if( !date_Get( &p_sys
->end_date
) && !p_block
->i_pts
)
302 /* We've just started the stream, wait for the first PTS. */
303 block_Release( p_block
);
307 if( p_block
->i_buffer
<= 0 )
309 block_Release( p_block
);
313 if( (p_block
->i_flags
& BLOCK_FLAG_PRIVATE_REALLOCATED
) == 0 )
315 *pp_block
= p_block
= block_Realloc( p_block
, 0, p_block
->i_buffer
+ FF_INPUT_BUFFER_PADDING_SIZE
);
318 p_block
->i_buffer
-= FF_INPUT_BUFFER_PADDING_SIZE
;
319 memset( &p_block
->p_buffer
[p_block
->i_buffer
], 0, FF_INPUT_BUFFER_PADDING_SIZE
);
321 p_block
->i_flags
|= BLOCK_FLAG_PRIVATE_REALLOCATED
;
326 i_output
= __MAX( p_block
->i_buffer
, p_sys
->i_output_max
);
327 if( i_output
> p_sys
->i_output_max
)
329 /* Grow output buffer if necessary (eg. for PCM data) */
330 p_sys
->p_output
= av_realloc( p_sys
->p_output
, i_output
);
333 av_init_packet( &pkt
);
334 pkt
.data
= p_block
->p_buffer
;
335 pkt
.size
= p_block
->i_buffer
;
336 i_used
= avcodec_decode_audio3( p_sys
->p_context
,
337 (int16_t*)p_sys
->p_output
, &i_output
,
340 if( i_used
< 0 || i_output
< 0 )
343 msg_Warn( p_dec
, "cannot decode one frame (%zu bytes)",
346 block_Release( p_block
);
349 else if( (size_t)i_used
> p_block
->i_buffer
)
351 i_used
= p_block
->i_buffer
;
354 p_block
->i_buffer
-= i_used
;
355 p_block
->p_buffer
+= i_used
;
357 } while( p_block
->i_buffer
> 0 && i_output
<= 0 );
359 if( p_sys
->p_context
->channels
<= 0 || p_sys
->p_context
->channels
> 8 ||
360 p_sys
->p_context
->sample_rate
<= 0 )
362 msg_Warn( p_dec
, "invalid audio properties channels count %d, sample rate %d",
363 p_sys
->p_context
->channels
, p_sys
->p_context
->sample_rate
);
364 block_Release( p_block
);
368 if( p_dec
->fmt_out
.audio
.i_rate
!= (unsigned int)p_sys
->p_context
->sample_rate
)
370 date_Init( &p_sys
->end_date
, p_sys
->p_context
->sample_rate
, 1 );
371 date_Set( &p_sys
->end_date
, p_block
->i_pts
);
374 /* **** Set audio output parameters **** */
375 SetupOutputFormat( p_dec
, true );
377 if( p_block
->i_pts
!= 0 &&
378 p_block
->i_pts
!= date_Get( &p_sys
->end_date
) )
380 date_Set( &p_sys
->end_date
, p_block
->i_pts
);
384 /* **** Now we can output these samples **** */
385 p_sys
->i_samples
= i_output
/ (p_dec
->fmt_out
.audio
.i_bitspersample
/ 8) / p_sys
->p_context
->channels
;
386 p_sys
->p_samples
= p_sys
->p_output
;
388 /* Silent unwanted samples */
389 if( p_sys
->i_reject_count
> 0 )
391 memset( p_sys
->p_output
, 0, i_output
);
392 p_sys
->i_reject_count
--;
395 p_buffer
= SplitBuffer( p_dec
);
396 if( !p_buffer
) block_Release( p_block
);
400 /*****************************************************************************
401 * EndAudioDec: audio decoder destruction
402 *****************************************************************************/
403 void EndAudioDec( decoder_t
*p_dec
)
405 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
407 av_free( p_sys
->p_output
);
410 /*****************************************************************************
412 *****************************************************************************/
414 void GetVlcAudioFormat( vlc_fourcc_t
*pi_codec
, unsigned *pi_bits
, int i_sample_fmt
)
416 switch( i_sample_fmt
)
419 *pi_codec
= VLC_CODEC_U8
;
423 *pi_codec
= VLC_CODEC_S32N
;
427 *pi_codec
= VLC_CODEC_FL32
;
431 *pi_codec
= VLC_CODEC_FL64
;
437 *pi_codec
= VLC_CODEC_S16N
;
443 static const uint64_t pi_channels_map
[][2] =
445 { CH_FRONT_LEFT
, AOUT_CHAN_LEFT
},
446 { CH_FRONT_RIGHT
, AOUT_CHAN_RIGHT
},
447 { CH_FRONT_CENTER
, AOUT_CHAN_CENTER
},
448 { CH_LOW_FREQUENCY
, AOUT_CHAN_LFE
},
449 { CH_BACK_LEFT
, AOUT_CHAN_REARLEFT
},
450 { CH_BACK_RIGHT
, AOUT_CHAN_REARRIGHT
},
451 { CH_FRONT_LEFT_OF_CENTER
, 0 },
452 { CH_FRONT_RIGHT_OF_CENTER
, 0 },
453 { CH_BACK_CENTER
, AOUT_CHAN_REARCENTER
},
454 { CH_SIDE_LEFT
, AOUT_CHAN_MIDDLELEFT
},
455 { CH_SIDE_RIGHT
, AOUT_CHAN_MIDDLERIGHT
},
456 { CH_TOP_CENTER
, 0 },
457 { CH_TOP_FRONT_LEFT
, 0 },
458 { CH_TOP_FRONT_CENTER
, 0 },
459 { CH_TOP_FRONT_RIGHT
, 0 },
460 { CH_TOP_BACK_LEFT
, 0 },
461 { CH_TOP_BACK_CENTER
, 0 },
462 { CH_TOP_BACK_RIGHT
, 0 },
463 { CH_STEREO_LEFT
, 0 },
464 { CH_STEREO_RIGHT
, 0 },
467 static void SetupOutputFormat( decoder_t
*p_dec
, bool b_trust
)
469 decoder_sys_t
*p_sys
= p_dec
->p_sys
;
471 GetVlcAudioFormat( &p_dec
->fmt_out
.i_codec
,
472 &p_dec
->fmt_out
.audio
.i_bitspersample
,
473 p_sys
->p_context
->sample_fmt
);
474 p_dec
->fmt_out
.audio
.i_rate
= p_sys
->p_context
->sample_rate
;
477 if( p_sys
->i_previous_channels
== p_sys
->p_context
->channels
&&
478 p_sys
->i_previous_layout
== p_sys
->p_context
->channel_layout
)
482 p_sys
->i_previous_channels
= p_sys
->p_context
->channels
;
483 p_sys
->i_previous_layout
= p_sys
->p_context
->channel_layout
;
487 * FIXME should we use fmt_in.audio.i_physical_channels or not ?
489 const unsigned i_order_max
= 8 * sizeof(p_sys
->p_context
->channel_layout
);
490 uint32_t pi_order_src
[i_order_max
];
491 int i_channels_src
= 0;
493 if( p_sys
->p_context
->channel_layout
)
495 for( unsigned i
= 0; i
< sizeof(pi_channels_map
)/sizeof(*pi_channels_map
); i
++ )
497 if( p_sys
->p_context
->channel_layout
& pi_channels_map
[i
][0] )
498 pi_order_src
[i_channels_src
++] = pi_channels_map
[i
][1];
503 /* Create default order */
505 msg_Warn( p_dec
, "Physical channel configuration not set : guessing" );
506 for( unsigned int i
= 0; i
< __MIN( i_order_max
, (unsigned)p_sys
->p_context
->channels
); i
++ )
508 if( i
< sizeof(pi_channels_map
)/sizeof(*pi_channels_map
) )
509 pi_order_src
[i_channels_src
++] = pi_channels_map
[i
][1];
512 if( i_channels_src
!= p_sys
->p_context
->channels
&& b_trust
)
513 msg_Err( p_dec
, "Channel layout not understood" );
515 uint32_t i_layout_dst
;
517 p_sys
->b_extract
= aout_CheckChannelExtraction( p_sys
->pi_extraction
,
518 &i_layout_dst
, &i_channels_dst
,
519 NULL
, pi_order_src
, i_channels_src
);
520 if( i_channels_dst
!= i_channels_src
&& b_trust
)
521 msg_Warn( p_dec
, "%d channels are dropped", i_channels_src
- i_channels_dst
);
523 p_dec
->fmt_out
.audio
.i_physical_channels
=
524 p_dec
->fmt_out
.audio
.i_original_channels
= i_layout_dst
;
525 p_dec
->fmt_out
.audio
.i_channels
= i_channels_dst
;