/*****************************************************************************
- * audio.c: audio decoder using ffmpeg library
+ * audio.c: audio decoder using libavcodec library
*****************************************************************************
* Copyright (C) 1999-2003 the VideoLAN team
* $Id$
#include <vlc_codec.h>
#include <vlc_avcodec.h>
-/* ffmpeg header */
-#ifdef HAVE_LIBAVCODEC_AVCODEC_H
-# include <libavcodec/avcodec.h>
-#else
-# include <avcodec.h>
+#include <libavcodec/avcodec.h>
+#include <libavutil/mem.h>
+
+#if LIBAVUTIL_VERSION_INT >= ((50<<16)+(38<<8)+0)
+# include "libavutil/audioconvert.h"
#endif
#include "avcodec.h"
/*****************************************************************************
* InitAudioDec: initialize audio decoder
*****************************************************************************
- * The ffmpeg codec will be opened, some memory allocated.
+ * The avcodec codec will be opened, some memory allocated.
*****************************************************************************/
int InitAudioDec( decoder_t *p_dec, AVCodecContext *p_context,
AVCodec *p_codec, int i_codec_id, const char *psz_namecodec )
return VLC_ENOMEM;
}
- p_codec->type = CODEC_TYPE_AUDIO;
- p_context->codec_type = CODEC_TYPE_AUDIO;
+ p_codec->type = AVMEDIA_TYPE_AUDIO;
+ p_context->codec_type = AVMEDIA_TYPE_AUDIO;
p_context->codec_id = i_codec_id;
p_sys->p_context = p_context;
p_sys->p_codec = p_codec;
* SplitBuffer: Needed because aout really doesn't like big audio chunk and
* wma produces easily > 30000 samples...
*****************************************************************************/
-static aout_buffer_t *SplitBuffer( decoder_t *p_dec )
+static block_t *SplitBuffer( decoder_t *p_dec )
{
decoder_sys_t *p_sys = p_dec->p_sys;
int i_samples = __MIN( p_sys->i_samples, 4096 );
- aout_buffer_t *p_buffer;
+ block_t *p_buffer;
if( i_samples == 0 ) return NULL;
/*****************************************************************************
* DecodeAudio: Called to decode one frame
*****************************************************************************/
-aout_buffer_t * DecodeAudio ( decoder_t *p_dec, block_t **pp_block )
+block_t * DecodeAudio ( decoder_t *p_dec, block_t **pp_block )
{
decoder_sys_t *p_sys = p_dec->p_sys;
int i_used, i_output;
- aout_buffer_t *p_buffer;
+ block_t *p_buffer;
block_t *p_block;
+ AVPacket pkt;
if( !pp_block || !*pp_block ) return NULL;
p_sys->p_output = av_realloc( p_sys->p_output, i_output );
}
- i_used = avcodec_decode_audio2( p_sys->p_context,
+ av_init_packet( &pkt );
+ pkt.data = p_block->p_buffer;
+ pkt.size = p_block->i_buffer;
+ i_used = avcodec_decode_audio3( p_sys->p_context,
(int16_t*)p_sys->p_output, &i_output,
- p_block->p_buffer, p_block->i_buffer );
+ &pkt );
if( i_used < 0 || i_output < 0 )
{
{
switch( i_sample_fmt )
{
- case SAMPLE_FMT_U8:
+ case AV_SAMPLE_FMT_U8:
*pi_codec = VLC_CODEC_U8;
*pi_bits = 8;
break;
- case SAMPLE_FMT_S32:
+ case AV_SAMPLE_FMT_S32:
*pi_codec = VLC_CODEC_S32N;
*pi_bits = 32;
break;
- case SAMPLE_FMT_FLT:
+ case AV_SAMPLE_FMT_FLT:
*pi_codec = VLC_CODEC_FL32;
*pi_bits = 32;
break;
- case SAMPLE_FMT_DBL:
+ case AV_SAMPLE_FMT_DBL:
*pi_codec = VLC_CODEC_FL64;
*pi_bits = 64;
break;
- case SAMPLE_FMT_S16:
+ case AV_SAMPLE_FMT_S16:
default:
*pi_codec = VLC_CODEC_S16N;
*pi_bits = 16;
static const uint64_t pi_channels_map[][2] =
{
- { CH_FRONT_LEFT, AOUT_CHAN_LEFT },
- { CH_FRONT_RIGHT, AOUT_CHAN_RIGHT },
- { CH_FRONT_CENTER, AOUT_CHAN_CENTER },
- { CH_LOW_FREQUENCY, AOUT_CHAN_LFE },
- { CH_BACK_LEFT, AOUT_CHAN_REARLEFT },
- { CH_BACK_RIGHT, AOUT_CHAN_REARRIGHT },
- { CH_FRONT_LEFT_OF_CENTER, 0 },
- { CH_FRONT_RIGHT_OF_CENTER, 0 },
- { CH_BACK_CENTER, AOUT_CHAN_REARCENTER },
- { CH_SIDE_LEFT, AOUT_CHAN_MIDDLELEFT },
- { CH_SIDE_RIGHT, AOUT_CHAN_MIDDLERIGHT },
- { CH_TOP_CENTER, 0 },
- { CH_TOP_FRONT_LEFT, 0 },
- { CH_TOP_FRONT_CENTER, 0 },
- { CH_TOP_FRONT_RIGHT, 0 },
- { CH_TOP_BACK_LEFT, 0 },
- { CH_TOP_BACK_CENTER, 0 },
- { CH_TOP_BACK_RIGHT, 0 },
- { CH_STEREO_LEFT, 0 },
- { CH_STEREO_RIGHT, 0 },
+ { AV_CH_FRONT_LEFT, AOUT_CHAN_LEFT },
+ { AV_CH_FRONT_RIGHT, AOUT_CHAN_RIGHT },
+ { AV_CH_FRONT_CENTER, AOUT_CHAN_CENTER },
+ { AV_CH_LOW_FREQUENCY, AOUT_CHAN_LFE },
+ { AV_CH_BACK_LEFT, AOUT_CHAN_REARLEFT },
+ { AV_CH_BACK_RIGHT, AOUT_CHAN_REARRIGHT },
+ { AV_CH_FRONT_LEFT_OF_CENTER, 0 },
+ { AV_CH_FRONT_RIGHT_OF_CENTER, 0 },
+ { AV_CH_BACK_CENTER, AOUT_CHAN_REARCENTER },
+ { AV_CH_SIDE_LEFT, AOUT_CHAN_MIDDLELEFT },
+ { AV_CH_SIDE_RIGHT, AOUT_CHAN_MIDDLERIGHT },
+ { AV_CH_TOP_CENTER, 0 },
+ { AV_CH_TOP_FRONT_LEFT, 0 },
+ { AV_CH_TOP_FRONT_CENTER, 0 },
+ { AV_CH_TOP_FRONT_RIGHT, 0 },
+ { AV_CH_TOP_BACK_LEFT, 0 },
+ { AV_CH_TOP_BACK_CENTER, 0 },
+ { AV_CH_TOP_BACK_RIGHT, 0 },
+ { AV_CH_STEREO_LEFT, 0 },
+ { AV_CH_STEREO_RIGHT, 0 },
};
static void SetupOutputFormat( decoder_t *p_dec, bool b_trust )