/* ffmpeg header */
#ifdef HAVE_LIBAVCODEC_AVCODEC_H
# include <libavcodec/avcodec.h>
-#elif defined(HAVE_FFMPEG_AVCODEC_H)
-# include <ffmpeg/avcodec.h>
#else
# include <avcodec.h>
#endif
+#if LIBAVUTIL_VERSION_INT >= ((50<<16)+(38<<8)+0)
+# include "libavutil/audioconvert.h"
+#endif
+
#include "avcodec.h"
/*****************************************************************************
*****************************************************************************/
struct decoder_sys_t
{
- FFMPEG_COMMON_MEMBERS
+ AVCODEC_COMMON_MEMBERS
/* Temporary buffer for libavcodec */
int i_output_max;
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;
p_sys->i_codec_id = i_codec_id;
p_sys->psz_namecodec = psz_namecodec;
- p_sys->b_delayed_open = false;
+ p_sys->b_delayed_open = true;
// Initialize decoder extradata
InitDecoderConfig( p_dec, p_context);
- /* ***** Fill p_context with init values ***** */
- p_sys->p_context->sample_rate = p_dec->fmt_in.audio.i_rate;
- p_sys->p_context->channels = p_dec->fmt_in.audio.i_channels;
-
- p_sys->p_context->block_align = p_dec->fmt_in.audio.i_blockalign;
- p_sys->p_context->bit_rate = p_dec->fmt_in.i_bitrate;
- p_sys->p_context->bits_per_coded_sample = p_dec->fmt_in.audio.i_bitspersample;
-
/* ***** Open the codec ***** */
- int ret;
- vlc_avcodec_lock();
- ret = avcodec_open( p_sys->p_context, p_sys->p_codec );
- vlc_avcodec_unlock();
- if( ret < 0 )
+ if( ffmpeg_OpenCodec( p_dec ) < 0 )
{
msg_Err( p_dec, "cannot open codec (%s)", p_sys->psz_namecodec );
free( p_sys->p_context->extradata );
return VLC_EGENERIC;
}
- msg_Dbg( p_dec, "ffmpeg codec (%s) started", p_sys->psz_namecodec );
-
switch( i_codec_id )
{
case CODEC_ID_WAVPACK:
int i_used, i_output;
aout_buffer_t *p_buffer;
block_t *p_block;
+ AVPacket pkt;
if( !pp_block || !*pp_block ) return NULL;
p_block = *pp_block;
+ if( !p_sys->p_context->extradata_size && p_dec->fmt_in.i_extra &&
+ p_sys->b_delayed_open)
+ {
+ InitDecoderConfig( p_dec, p_sys->p_context);
+ if( ffmpeg_OpenCodec( p_dec ) )
+ msg_Err( p_dec, "Cannot open decoder %s", p_sys->psz_namecodec );
+ }
+ if( p_sys->b_delayed_open )
+ {
+ block_Release( p_block );
+ return NULL;
+ }
+
if( p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED) )
{
block_Release( p_block );
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 )